Lý do chính mà tôi thấy ngày nay là trường hợp sử dụng cho memcached trên Redis là hiệu quả bộ nhớ vượt trội mà bạn có thể nhận được với bộ nhớ đệm các đoạn HTML thuần túy (hoặc các ứng dụng tương tự). Nếu bạn cần lưu trữ các trường khác nhau của các đối tượng trong các khóa memcached khác nhau, thì hàm băm Redis sẽ hiệu quả hơn về bộ nhớ, nhưng khi bạn có một số lượng lớn các cặp key -> simple_string, memcached sẽ có thể cung cấp cho bạn nhiều mục hơn mỗi megabyte.
Những điều khác là điểm tốt về memcached:
- Nó là một đoạn mã rất đơn giản, vì vậy nếu bạn chỉ cần chức năng mà nó cung cấp, tôi đoán nó là một sự thay thế hợp lý, nhưng tôi chưa bao giờ sử dụng nó trong sản xuất.
- Nó là đa luồng, vì vậy nếu bạn cần mở rộng quy mô trong thiết lập một hộp, đó là một điều tốt và bạn chỉ cần nói chuyện với một phiên bản.
Tôi tin rằng Redis như một bộ nhớ cache ngày càng có ý nghĩa hơn khi mọi người hướng tới bộ nhớ đệm thông minh hoặc khi họ cố gắng bảo toàn cấu trúc của dữ liệu được lưu trong bộ nhớ cache thông qua cấu trúc dữ liệu Redis.
So sánh giữa Redis LRU và memcached LRU.
Cả memcached và Redis đều không thực hiện các thao tác đuổi LRU thực, mà chỉ là một phép gần đúng.
Loại bỏ Memcache là lớp theo kích thước và phụ thuộc vào chi tiết triển khai của trình cấp phát phiến của nó. Ví dụ: nếu bạn muốn thêm một mục phù hợp với một lớp kích thước nhất định, memcached sẽ cố gắng xóa các mục đã hết hạn / không được sử dụng gần đây trong lớp đó, thay vào đó, cố gắng toàn cục để hiểu đối tượng là gì, bất kể nó là gì kích thước, đó là ứng cử viên tốt nhất.
Thay vào đó, Redis cố gắng chọn một đối tượng tốt làm ứng cử viên cho việc loại bỏ khi maxmemory
đạt đến giới hạn, xem xét tất cả các đối tượng, bất kể loại kích thước, nhưng chỉ có thể cung cấp một đối tượng xấp xỉ tốt, không phải đối tượng tốt nhất với thời gian nhàn rỗi lớn hơn thời gian.
Cách Redis thực hiện điều này là lấy mẫu một vài đối tượng, chọn đối tượng không hoạt động (không được truy cập) trong thời gian dài nhất. Kể từ khi Redis 3.0 (hiện đang trong giai đoạn thử nghiệm), thuật toán đã được cải thiện và cũng có một nhóm ứng cử viên tốt qua các lần trục xuất, vì vậy ước tính gần đúng đã được cải thiện. Trong tài liệu Redis, bạn có thể tìm thấy mô tả và biểu đồ với chi tiết về cách hoạt động của nó .
Tại sao memcached có dung lượng bộ nhớ tốt hơn Redis đối với bản đồ chuỗi -> chuỗi đơn giản.
Redis là một phần mềm phức tạp hơn, vì vậy các giá trị trong Redis được lưu trữ theo cách gần giống với các đối tượng trong ngôn ngữ lập trình cấp cao: chúng có kiểu liên kết, mã hóa, đếm tham chiếu để quản lý bộ nhớ. Điều này làm cho cấu trúc bên trong của Redis tốt và dễ quản lý, nhưng có chi phí cao hơn so với memcached chỉ xử lý các chuỗi.
Khi Redis bắt đầu sử dụng bộ nhớ hiệu quả hơn
Redis có thể lưu trữ các kiểu dữ liệu tổng hợp nhỏ theo cách tiết kiệm bộ nhớ đặc biệt. Ví dụ: một Redis Hash nhỏ đại diện cho một đối tượng, được lưu trữ bên trong không phải với bảng băm, mà là một đốm màu duy nhất nhị phân. Vì vậy, việc đặt nhiều trường cho mỗi đối tượng thành một hàm băm sẽ hiệu quả hơn việc lưu trữ N khóa tách biệt vào bộ nhớ đệm.
Trên thực tế, bạn có thể lưu trữ một đối tượng vào memcached dưới dạng một khối JSON (hoặc được mã hóa nhị phân), nhưng trái với Redis, điều này sẽ không cho phép bạn tìm nạp hoặc cập nhật các trường độc lập.
Lợi thế của Redis trong bối cảnh bộ nhớ đệm thông minh.
Do cấu trúc dữ liệu Redis, mẫu thông thường được sử dụng với memcached để hủy các đối tượng khi bộ đệm bị vô hiệu, để tạo lại nó từ DB sau này, là một cách nguyên thủy để sử dụng Redis.
Ví dụ: hãy tưởng tượng bạn cần lưu vào bộ nhớ cache N tin tức mới nhất được đăng vào Tin tức Hacker để đưa vào phần "Mới nhất" của trang web. Những gì bạn làm với Redis là lấy một danh sách (giới hạn ở M mục) với những tin tức mới nhất được chèn vào. Nếu bạn sử dụng một kho lưu trữ khác cho dữ liệu của mình và Redis làm bộ nhớ đệm, việc bạn làm là điền vào cả hai dạng xem (Redis và DB) khi một mục mới được đăng. Không có sự vô hiệu bộ nhớ cache.
Tuy nhiên, ứng dụng luôn có thể có logic để nếu danh sách Redis được tìm thấy là trống, ví dụ sau khi khởi động, chế độ xem ban đầu có thể được tạo lại từ DB.
Bằng cách sử dụng bộ nhớ đệm thông minh, có thể thực hiện bộ nhớ đệm với Redis theo cách hiệu quả hơn so với bộ nhớ đệm, nhưng không phải tất cả các vấn đề đều phù hợp với mẫu này. Ví dụ: bộ nhớ đệm các đoạn HTML có thể không được hưởng lợi từ kỹ thuật này.