Tóm tắt (TL; DR)
Cập nhật ngày 3 tháng 6 năm 2017
Redis mạnh hơn, phổ biến hơn và được hỗ trợ tốt hơn so với memcached. Memcached chỉ có thể làm một phần nhỏ những việc mà Redis có thể làm. Redis là tốt hơn ngay cả khi các tính năng của họ chồng chéo.
Đối với bất cứ điều gì mới, sử dụng Redis.
Memcached vs Redis: So sánh trực tiếp
Cả hai công cụ này đều lưu trữ dữ liệu trong bộ nhớ mạnh mẽ, nhanh chóng, hữu ích như bộ đệm. Cả hai đều có thể giúp tăng tốc ứng dụng của bạn bằng cách lưu trữ kết quả cơ sở dữ liệu, các đoạn HTML hoặc bất kỳ thứ gì khác có thể tốn kém để tạo.
Những điểm cần xem xét
Khi được sử dụng cho cùng một điều, đây là cách họ so sánh bằng cách sử dụng "Điểm cần xem xét" của câu hỏi ban đầu:
- Tốc độ đọc / ghi : Cả hai đều cực kỳ nhanh. Điểm chuẩn thay đổi theo khối lượng công việc, phiên bản và nhiều yếu tố khác nhưng thường cho thấy redis sẽ nhanh hoặc gần như nhanh như memcached. Tôi khuyên bạn nên redis, nhưng không phải vì memcached chậm. Nó không thể.
- Sử dụng bộ nhớ : Redis là tốt hơn.
- memcached: Bạn chỉ định kích thước bộ đệm và khi bạn chèn các mục, trình nền nhanh chóng tăng lên một chút so với kích thước này. Không bao giờ thực sự có một cách để lấy lại bất kỳ không gian nào, thiếu khởi động lại memcached. Tất cả các khóa của bạn có thể hết hạn, bạn có thể xóa cơ sở dữ liệu và nó vẫn sẽ sử dụng toàn bộ khối RAM mà bạn đã cấu hình.
- redis: Đặt kích thước tối đa là tùy thuộc vào bạn. Redis sẽ không bao giờ sử dụng nhiều hơn nó phải và sẽ trả lại cho bạn bộ nhớ mà nó không còn sử dụng nữa.
- Tôi đã lưu trữ 100.000 ~ 2KB chuỗi (~ 200MB) câu ngẫu nhiên vào cả hai. Sử dụng RAM Memcached tăng lên ~ 225MB. Sử dụng lại RAM đã tăng lên ~ 228 MB. Sau khi xả cả hai, redis giảm xuống ~ 29MB và memcached ở mức ~ 225MB. Chúng có hiệu quả tương tự trong cách chúng lưu trữ dữ liệu, nhưng chỉ có một người có khả năng lấy lại dữ liệu.
- Bán phá giá đĩa I / O : Một chiến thắng rõ ràng cho redis vì nó làm điều này theo mặc định và có tính bền bỉ rất cấu hình. Memcached không có cơ chế để đổ vào đĩa mà không có công cụ của bên thứ 3.
- Chia tỷ lệ : Cả hai cung cấp cho bạn hàng tấn khoảng không trước khi bạn cần nhiều hơn một thể hiện dưới dạng bộ đệm. Redis bao gồm các công cụ để giúp bạn vượt qua điều đó trong khi memcached thì không.
nhớ
Memcached là một máy chủ bộ đệm dễ bay hơi đơn giản. Nó cho phép bạn lưu trữ các cặp khóa / giá trị trong đó giá trị được giới hạn là một chuỗi lên tới 1MB.
Nó tốt ở đây, nhưng đó là tất cả những gì nó làm. Bạn có thể truy cập các giá trị đó bằng khóa của chúng ở tốc độ cực cao, thường bão hòa mạng có sẵn hoặc thậm chí băng thông bộ nhớ.
Khi bạn khởi động lại memcached, dữ liệu của bạn sẽ biến mất. Điều này là tốt cho một bộ đệm. Bạn không nên lưu trữ bất cứ điều gì quan trọng ở đó.
Nếu bạn cần hiệu suất cao hoặc tính sẵn sàng cao, có các công cụ, sản phẩm và dịch vụ của bên thứ 3.
làm lại
Redis có thể làm những công việc tương tự như memcached có thể, và có thể làm chúng tốt hơn.
Redis có thể hoạt động như một bộ đệm . Nó cũng có thể lưu trữ các cặp khóa / giá trị. Trong redis chúng thậm chí có thể lên tới 512MB.
Bạn có thể tắt tính bền bỉ và nó cũng sẽ mất dữ liệu khi khởi động lại. Nếu bạn muốn bộ nhớ cache của bạn tồn tại, nó cũng cho phép bạn làm điều đó. Trong thực tế, đó là mặc định.
Nó cũng siêu nhanh, thường bị giới hạn bởi băng thông mạng hoặc bộ nhớ.
Nếu một phiên bản redis / memcached không đủ hiệu năng cho khối lượng công việc của bạn, thì redis là lựa chọn rõ ràng. Redis bao gồm hỗ trợ cụm và đi kèm với các công cụ có tính sẵn sàng cao ( redis-sentinel ) ngay "trong hộp". Trong vài năm qua, redis cũng đã nổi lên như một nhà lãnh đạo rõ ràng trong công cụ của bên thứ 3. Các công ty như Redis Labs, Amazon và các công ty khác cung cấp nhiều công cụ và dịch vụ hữu ích của redis. Hệ sinh thái xung quanh redis lớn hơn nhiều. Số lượng triển khai quy mô lớn hiện có khả năng lớn hơn so với memcached.
Superset Redis
Redis không chỉ là bộ đệm. Nó là một máy chủ cấu trúc dữ liệu trong bộ nhớ. Dưới đây bạn sẽ tìm thấy một cái nhìn tổng quan nhanh về những điều Redis có thể làm ngoài việc là một bộ đệm khóa / giá trị đơn giản như memcached. Hầu hết các tính năng của redis là những điều mà memcached không thể làm được.
Tài liệu
Redis là tài liệu tốt hơn so với memcached. Trong khi điều này có thể chủ quan, nó dường như ngày càng đúng hơn mọi lúc.
redis.io là một nguồn tài nguyên dễ dàng điều hướng tuyệt vời. Nó cho phép bạn thử redis trong trình duyệt và thậm chí cung cấp cho bạn các ví dụ tương tác trực tiếp với từng lệnh trong tài liệu.
Hiện tại có gấp 2 lần kết quả stackoverflow cho redis như memcached. Nhân đôi số kết quả của Google. Ví dụ dễ tiếp cận hơn trong nhiều ngôn ngữ. Phát triển tích cực hơn. Phát triển khách hàng tích cực hơn. Các phép đo này có thể không có ý nghĩa riêng lẻ nhiều, nhưng kết hợp lại, chúng vẽ ra một bức tranh rõ ràng rằng sự hỗ trợ và tài liệu cho redis là lớn hơn và cập nhật hơn nhiều.
Theo mặc định, redis vẫn duy trì dữ liệu của bạn vào đĩa bằng cách sử dụng một cơ chế gọi là snapshOUND. Nếu bạn có đủ RAM, nó có thể ghi tất cả dữ liệu của bạn vào đĩa mà hầu như không bị suy giảm hiệu năng. Nó gần như miễn phí!
Trong chế độ chụp nhanh, có khả năng một sự cố bất ngờ có thể dẫn đến một lượng nhỏ dữ liệu bị mất. Nếu bạn thực sự cần phải đảm bảo không có dữ liệu nào bị mất, đừng lo lắng, bạn cũng sẽ quay lại với chế độ AOF (Append Only File). Trong chế độ kiên trì này, dữ liệu có thể được đồng bộ hóa vào đĩa khi được ghi. Điều này có thể giảm thông lượng ghi tối đa xuống tuy nhiên đĩa của bạn có thể ghi nhanh, nhưng vẫn khá nhanh.
Có nhiều tùy chọn cấu hình để tinh chỉnh sự bền bỉ nếu bạn cần, nhưng mặc định là rất hợp lý. Các tùy chọn này giúp bạn dễ dàng thiết lập redis như một nơi an toàn, dự phòng để lưu trữ dữ liệu. Nó là một cơ sở dữ liệu thực sự .
Nhiều kiểu dữ liệu
Memcached bị giới hạn ở các chuỗi, nhưng Redis là một máy chủ cấu trúc dữ liệu có thể phục vụ nhiều loại dữ liệu khác nhau. Nó cũng cung cấp các lệnh bạn cần để tận dụng tối đa các kiểu dữ liệu đó.
Chuỗi ( lệnh )
Văn bản đơn giản hoặc giá trị nhị phân có thể có kích thước lên tới 512MB. Đây là kiểu dữ liệu duy nhất được chia sẻ lại và chia sẻ memcached, mặc dù các chuỗi memcached được giới hạn ở 1MB.
Redis cung cấp cho bạn nhiều công cụ hơn để tận dụng kiểu dữ liệu này bằng cách cung cấp các lệnh cho các hoạt động theo bit, thao tác ở mức bit, hỗ trợ tăng / giảm điểm trôi nổi, truy vấn phạm vi và hoạt động đa khóa. Memcached không hỗ trợ bất kỳ điều đó.
Chuỗi rất hữu ích cho tất cả các loại trường hợp sử dụng, đó là lý do tại sao memcached khá hữu ích với riêng loại dữ liệu này.
Băm là loại giống như một cửa hàng giá trị khóa trong kho lưu trữ giá trị khóa. Chúng ánh xạ giữa các trường chuỗi và giá trị chuỗi. Bản đồ trường-> giá trị sử dụng hàm băm có hiệu quả không gian hơn một chút so với bản đồ khóa-> giá trị sử dụng chuỗi thông thường.
Băm là hữu ích như một không gian tên hoặc khi bạn muốn nhóm hợp lý nhiều khóa. Với hàm băm, bạn có thể lấy tất cả các thành viên một cách hiệu quả, hết hạn các thành viên lại với nhau, xóa tất cả các thành viên cùng nhau, v.v ... Tuyệt vời cho mọi trường hợp sử dụng khi bạn có một vài cặp khóa / giá trị cần được nhóm.
Một ví dụ sử dụng hàm băm là để lưu trữ hồ sơ người dùng giữa các ứng dụng. Băm redis được lưu trữ với ID người dùng làm khóa sẽ cho phép bạn lưu trữ bao nhiêu bit dữ liệu về người dùng khi cần trong khi giữ chúng được lưu trữ dưới một khóa duy nhất. Ưu điểm của việc sử dụng hàm băm thay vì tuần tự hóa hồ sơ thành một chuỗi là bạn có thể có các ứng dụng khác nhau đọc / ghi các trường khác nhau trong hồ sơ người dùng mà không phải lo lắng về một ứng dụng ghi đè các thay đổi do người khác thực hiện (điều này có thể xảy ra nếu bạn tuần tự hóa cũ dữ liệu).
Danh sách ( lệnh )
Danh sách Redis được sắp xếp các bộ sưu tập của chuỗi. Chúng được tối ưu hóa để chèn, đọc hoặc xóa các giá trị từ đầu hoặc cuối (còn gọi là: trái hoặc phải) của danh sách.
Redis cung cấp nhiều lệnh để tận dụng danh sách, bao gồm các lệnh để đẩy / bật các mục, đẩy / bật giữa các danh sách, danh sách cắt ngắn, thực hiện các truy vấn phạm vi, v.v.
Danh sách làm cho tuyệt vời bền, nguyên tử, hàng đợi. Chúng hoạt động tuyệt vời cho hàng đợi công việc, nhật ký, bộ đệm và nhiều trường hợp sử dụng khác.
Bộ là bộ sưu tập không có thứ tự của các giá trị duy nhất. Chúng được tối ưu hóa để cho phép bạn nhanh chóng kiểm tra xem một giá trị có trong tập hợp không, nhanh chóng thêm / xóa giá trị và để đo chồng chéo với các bộ khác.
Đây là những thứ tuyệt vời cho những thứ như danh sách kiểm soát truy cập, trình theo dõi khách truy cập duy nhất và nhiều thứ khác. Hầu hết các ngôn ngữ lập trình đều có một cái gì đó tương tự (thường được gọi là Bộ). Đây là như thế, chỉ phân phối.
Redis cung cấp một số lệnh để quản lý các bộ. Những thứ hiển nhiên như thêm, xóa và kiểm tra bộ có mặt. Vì vậy, các lệnh ít rõ ràng hơn như popping / đọc một mục ngẫu nhiên và các lệnh để thực hiện các hiệp và giao với các bộ khác.
Bộ sắp xếp ( lệnh )
Bộ sắp xếp cũng là bộ sưu tập các giá trị duy nhất. Những cái này, như tên của nó, được đặt hàng. Họ được sắp xếp theo một số điểm, sau đó từ vựng.
Kiểu dữ liệu này được tối ưu hóa để tra cứu nhanh theo điểm số. Lấy giá trị cao nhất, thấp nhất hoặc bất kỳ phạm vi giá trị nào ở giữa là cực kỳ nhanh.
Nếu bạn thêm người dùng vào một tập hợp được sắp xếp cùng với điểm số cao của họ, bạn có cho mình một bảng lãnh đạo hoàn hảo. Khi điểm số cao mới xuất hiện, chỉ cần thêm chúng vào nhóm một lần nữa với điểm số cao của chúng và nó sẽ sắp xếp lại bảng lãnh đạo của bạn. Cũng tuyệt vời để theo dõi lần cuối người dùng truy cập và những người đang hoạt động trong ứng dụng của bạn.
Lưu trữ các giá trị có cùng số điểm khiến chúng được sắp xếp theo thứ tự từ vựng (nghĩ theo bảng chữ cái). Điều này có thể hữu ích cho những thứ như tính năng tự động hoàn thành.
Nhiều lệnh được sắp xếp tương tự như lệnh cho các tập hợp, đôi khi có thêm tham số điểm. Cũng bao gồm các lệnh để quản lý điểm số và truy vấn theo điểm số.
Địa lý
Redis có một số lệnh để lưu trữ, truy xuất và đo dữ liệu địa lý. Điều này bao gồm các truy vấn bán kính và đo khoảng cách giữa các điểm.
Về mặt kỹ thuật, dữ liệu địa lý trong redis được lưu trữ trong các bộ được sắp xếp, vì vậy đây không phải là loại dữ liệu thực sự riêng biệt. Nó là một phần mở rộng trên đầu của các bộ được sắp xếp.
Bitmap và HyperLogLog
Giống như địa lý, đây không phải là loại dữ liệu hoàn toàn riêng biệt. Đây là các lệnh cho phép bạn xử lý dữ liệu chuỗi như thể đó là bitmap hoặc hyperloglog.
Bitmap là những gì mà các toán tử cấp bit mà tôi đã tham chiếu theo Strings
. Kiểu dữ liệu này là khối xây dựng cơ bản cho dự án nghệ thuật hợp tác gần đây của reddit: r / Place .
HyperLogLog cho phép bạn sử dụng một lượng không gian cực kỳ nhỏ để đếm các giá trị duy nhất gần như không giới hạn với độ chính xác gây sốc. Chỉ sử dụng ~ 16KB, bạn có thể đếm số lượng khách truy cập duy nhất vào trang web của mình một cách hiệu quả, ngay cả khi con số đó là hàng triệu.
Giao dịch và nguyên tử
Các lệnh trong redis là nguyên tử, có nghĩa là bạn có thể chắc chắn rằng ngay khi bạn viết một giá trị cho redis, giá trị đó sẽ hiển thị cho tất cả các máy khách được kết nối với redis. Không có chờ đợi giá trị đó để tuyên truyền. Về mặt kỹ thuật memcached cũng là nguyên tử, nhưng với redis thêm tất cả chức năng này ngoài memcached, điều đáng chú ý và hơi ấn tượng là tất cả các loại dữ liệu và tính năng bổ sung này cũng là nguyên tử.
Mặc dù không hoàn toàn giống như các giao dịch trong cơ sở dữ liệu quan hệ, redis cũng có các giao dịch sử dụng "khóa tối ưu" ( WATCH / MULTI / EXEC ).
Đường ống
Redis cung cấp một tính năng gọi là " đường ống ". Nếu bạn có nhiều lệnh redis mà bạn muốn thực thi, bạn có thể sử dụng pipelining để gửi chúng để làm lại tất cả cùng một lúc thay vì một lần.
Thông thường khi bạn thực thi một lệnh để redis hoặc memcached, mỗi lệnh là một chu kỳ yêu cầu / phản hồi riêng biệt. Với pipelining, redis có thể đệm một số lệnh và thực hiện tất cả chúng cùng một lúc, đáp ứng với tất cả các phản hồi cho tất cả các lệnh của bạn trong một câu trả lời.
Điều này có thể cho phép bạn đạt được thông lượng lớn hơn nữa khi nhập hàng loạt hoặc các hành động khác liên quan đến nhiều lệnh.
Quán rượu / phụ
Redis có các lệnh dành riêng cho chức năng pub / sub , cho phép redis hoạt động như một đài phát tin nhắn tốc độ cao. Điều này cho phép một khách hàng xuất bản tin nhắn cho nhiều khách hàng khác được kết nối với một kênh.
Redis không pub / sub cũng như hầu hết mọi công cụ. Các nhà môi giới tin nhắn chuyên dụng như RabbitMQ có thể có lợi thế ở một số khu vực nhất định, nhưng thực tế là cùng một máy chủ cũng có thể cung cấp cho bạn hàng đợi bền bỉ và các cấu trúc dữ liệu khác mà khối lượng công việc / quán rượu của bạn có thể cần, Redis thường sẽ chứng minh là công cụ đơn giản và tốt nhất cho công việc.
Lua Scripting
Bạn có thể nghĩ về các tập lệnh lua như SQL hoặc các thủ tục được lưu trữ của redis. Nó nhiều hơn và ít hơn thế, nhưng sự tương tự chủ yếu hoạt động.
Có thể bạn có các tính toán phức tạp mà bạn muốn redis thực hiện. Có thể bạn không đủ khả năng để giao dịch của mình quay trở lại và cần đảm bảo mọi bước của một quy trình phức tạp sẽ diễn ra nguyên tử. Những vấn đề này và nhiều vấn đề khác có thể được giải quyết với kịch bản lua.
Toàn bộ tập lệnh được thực thi nguyên tử, vì vậy nếu bạn có thể điều chỉnh logic của mình thành tập lệnh lua, bạn thường có thể tránh gây rối với các giao dịch khóa lạc quan.
Thu nhỏ
Như đã đề cập ở trên, redis bao gồm hỗ trợ tích hợp để phân cụm và được đóng gói với công cụ sẵn sàng cao được gọi là của nó redis-sentinel
.
Phần kết luận
Không do dự, tôi sẽ khuyên bạn nên làm lại trên memcached cho bất kỳ dự án mới nào, hoặc các dự án hiện tại chưa sử dụng memcached.
Ở trên có vẻ như tôi không thích memcached. Trái lại: nó là một công cụ mạnh mẽ, đơn giản, ổn định, trưởng thành và cứng. Thậm chí có một số trường hợp sử dụng mà nó nhanh hơn một chút so với redis. Tôi yêu memcached. Tôi chỉ không nghĩ rằng nó có ý nghĩa cho sự phát triển trong tương lai.
Redis làm mọi thứ memcached làm, thường tốt hơn. Bất kỳ lợi thế hiệu suất cho memcached là nhỏ và khối lượng công việc cụ thể. Ngoài ra còn có khối lượng công việc mà redis sẽ nhanh hơn và nhiều khối lượng công việc hơn mà redis có thể làm mà memcached đơn giản là không thể. Sự khác biệt hiệu năng nhỏ bé dường như rất nhỏ khi đối mặt với lỗ hổng lớn về chức năng và thực tế là cả hai công cụ này rất nhanh và hiệu quả, chúng rất có thể là phần cuối cùng của cơ sở hạ tầng của bạn mà bạn sẽ phải lo lắng về việc mở rộng quy mô.
Chỉ có một kịch bản mà memcached có ý nghĩa hơn: nơi memcached đã được sử dụng làm bộ đệm. Nếu bạn đã lưu vào bộ nhớ cache với memcached thì hãy tiếp tục sử dụng nó, nếu nó đáp ứng nhu cầu của bạn. Nó có thể không có giá trị nỗ lực để chuyển sang redis và nếu bạn sẽ sử dụng redis chỉ để lưu trữ, nó có thể không cung cấp đủ lợi ích xứng đáng với thời gian của bạn. Nếu memcached không đáp ứng nhu cầu của bạn, thì có lẽ bạn nên chuyển sang redis. Điều này đúng cho dù bạn cần mở rộng ra ngoài memcached hay bạn cần thêm chức năng.