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ể thực hiện một phần nhỏ những điều Redis có thể làm. Redis tốt hơn ngay cả khi các tính năng của chúng trùng lặp.
Đối với bất kỳ điều gì mới, hãy sử dụng Redis.
Memcached và Redis:So sánh trực tiếp
Cả hai công cụ đều mạnh mẽ, nhanh chóng, lưu trữ dữ liệu trong bộ nhớ, hữu ích như một bộ nhớ cache. Cả hai đều có thể giúp tăng tốc ứng dụng của bạn bằng cách lưu vào bộ đệm các 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 thứ, đây là cách chúng 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. Các điểm chuẩn khác nhau tùy theo khối lượng công việc, phiên bản và nhiều yếu tố khác nhưng nhìn chung cho thấy redis 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 phải.
- Sử dụng bộ nhớ :Redis tốt hơn.
- memcached:Bạn chỉ định kích thước bộ nhớ cache và khi bạn chèn các mục, daemon sẽ nhanh chóng phát triển lên nhiều hơn kích thước này một chút. Không bao giờ thực sự có cách nào để lấy lại bất kỳ không gian nào trong số đó, chỉ cần 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ó sẽ vẫn sử dụng toàn bộ phần RAM mà bạn đã định cấu hình.
- redis:Đặt kích thước tối đa là tùy bạn. Redis sẽ không bao giờ sử dụng nhiều hơn mức cần thiết 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ác câu ngẫu nhiên vào cả hai. Mức sử dụng RAM trong bộ nhớ đệm đã tăng lên ~ 225MB. Mức sử dụng RAM của Redis đã tăng lên ~ 228MB. 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 lưu trữ dữ liệu, nhưng chỉ có một loại có khả năng lấy lại dữ liệu.
- Kết xuất I / O trên đĩa :Một chiến thắng rõ ràng cho redis vì nó thực hiện điều này theo mặc định và có độ bền rất cao có thể định cấu hình. Memcached không có cơ chế để kết xuất vào đĩa mà không có công cụ của bên thứ ba.
- Chia tỷ lệ :Cả hai đều cung cấp cho bạn rất nhiều khoảng trống trước khi bạn cần nhiều hơn một phiên bản duy nhất làm bộ nhớ đệm. Redis bao gồm các công cụ để giúp bạn vượt ra ngoài điều đó trong khi memcached thì không.
memcached
Memcached là một máy chủ cache 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 tối đa 1MB.
Nó giỏi trong việc nà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 với tốc độ cực cao, thường xuyên bão hòa mạng khả dụng hoặc thậm chí cả băng thông bộ nhớ.
Khi bạn khởi động lại memcached, dữ liệu của bạn đã biến mất. Điều này là tốt cho một bộ nhớ cache. Bạn không nên lưu trữ bất cứ thứ gì quan trọng ở đó.
Nếu bạn cần hiệu suất cao hoặc tính khả dụng cao, có các công cụ, sản phẩm và dịch vụ của bên thứ ba.
redis
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ũng có thể hoạt động như một bộ nhớ cache. 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 đến 512MB.
Bạn có thể tắt tính năng liên tục và nó cũng sẽ mất dữ liệu của bạn khi khởi động lại. Nếu bạn muốn bộ nhớ cache của mình tồn tại, hãy khởi động lại nó cũng cho phép bạn làm điều đó. Trên 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 suất cho khối lượng công việc của bạn, 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 khả dụ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 lĩnh vực cung cấp công cụ của bên thứ 3. Các công ty như Redis Labs, Amazon và những công ty khác cung cấp nhiều công cụ và dịch vụ redis hữu ích. 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 nay có thể nhiều hơn so với memcached.
The Redis Superset
Redis không chỉ là một bộ nhớ cache. 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 tổng quan nhanh về những thứ Redis có thể làm ngoài việc trở thành một bộ nhớ cache khóa / giá trị đơn giản như memcached. Hầu hết trong số các tính năng của redis là những thứ mà memcached không thể làm được.
Tài liệu
Redis được ghi lại tốt hơn so với memcached. Mặc dù điều này có thể là chủ quan, nhưng nó dường như ngày càng đúng hơn mọi lúc.
redis.io là một tài nguyên tuyệt vời dễ điều hướng. 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 mỗi lệnh trong tài liệu.
Hiện có gấp 2 lần số kết quả stackoverflow cho redis dưới dạng memcached. Gấp đôi kết quả của Google. Các ví dụ dễ tiếp cận hơn bằng nhiều ngôn ngữ hơn. 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ó nhiều ý nghĩa riêng lẻ, nhưng kết hợp với nhau, chúng vẽ nên một bức tranh rõ ràng hỗ trợ và tài liệu cho việc thực hiện lại là lớn hơn và cập nhật hơn nhiều.
Tính bền bỉ
Theo mặc định, redis lưu dữ liệu của bạn vào đĩa bằng cơ chế gọi là snapshotting. 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ị giảm hiệu suất. Nó gần như miễn phí!
Ở chế độ chụp nhanh, có khả năng xảy ra sự cố đột ngột dẫn đến một lượng nhỏ dữ liệu bị mất. Nếu bạn thực sự cần đảm bảo không có dữ liệu nào bị mất, đừng lo lắng, redis cũng hỗ trợ bạn ở đó với chế độ AOF (Chỉ thêm tệp). Trong chế độ liên tục này, dữ liệu có thể được đồng bộ hóa với đĩa khi nó được ghi. Điều này có thể làm giảm thông lượng ghi tối đa xuống mức đĩa của bạn có thể ghi nhanh đến mức nào, nhưng vẫn phải khá nhanh.
Có nhiều tùy chọn cấu hình để tinh chỉnh độ bền nếu bạn cần, nhưng các giá trị mặc định 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. Đó là một thực tế cơ sở dữ liệu.
Nhiều loại 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 kiểu 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)
Giá trị văn bản hoặc nhị phân đơn giản có thể có kích thước lên đến 512MB. Đây là kiểu dữ liệu duy nhất redis 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 hoạt động theo chiều bit, thao tác ở mức bit, hỗ trợ tăng / giảm dấu phẩy động, truy vấn phạm vi và hoạt động đa khóa. Memcached không hỗ trợ bất kỳ điều nào trong số đó.
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 chỉ riêng kiểu dữ liệu này.
Hàm băm (lệnh)
Hàm băm giống như một kho lưu trữ giá trị quan trọng trong một kho lưu trữ giá trị quan trọng. 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 hiệu quả hơn một chút về không gian so với bản đồ giá trị> key-> sử dụng chuỗi thông thường.
Hàm băm hữu ích như một không gian tên hoặc khi bạn muốn nhóm nhiều khóa một cách hợp lý. 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 tất cả các thành viên cùng nhau, xóa tất cả các thành viên cùng nhau, v.v. Tuyệt vời cho bất kỳ trường hợp sử dụng nào khi bạn có một số cặp khóa / giá trị cần được nhóm lại.
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. Hàm 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 nếu cần trong khi vẫn lưu trữ chúng 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 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ề việc 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 là tập hợp các chuỗi có thứ tự. 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, cắt ngắn danh sách, thực hiện truy vấn phạm vi, v.v.
Danh sách tạo ra các hàng đợi, nguyên tử, bền tuyệt vời. Những thứ này hoạt động tốt 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ệnh)
Tập hợp là tập hợp các giá trị duy nhất không có thứ 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 hay không, nhanh chóng thêm / xóa các giá trị và đo lường sự chồng chéo với các tập hợp 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ự nhau (thường được gọi là Bộ). Đây là như vậy, chỉ được phân phối.
Redis cung cấp một số lệnh để quản lý các tập hợp. Những thứ rõ ràng như thêm, bớt và kiểm tra tập hợp đều có mặt. Vì vậy, các lệnh ít rõ ràng hơn như bật / đọc một mục ngẫu nhiên và các lệnh để thực hiện kết hợp và giao điểm với các bộ khác.
Bộ được sắp xếp (lệnh)
Tập hợp đã sắp xếp cũng là tập hợp các giá trị duy nhất. Những cái này, như tên của nó, được đặt hàng. Chúng được sắp xếp theo điểm, sau đó theo từ điển.
Loại dữ liệu này được tối ưu hóa để tra cứu nhanh theo điểm số. Việc nhận được giá trị cao nhất, thấp nhất hoặc bất kỳ dải giá trị nào ở giữa là cực kỳ nhanh chóng.
Nếu bạn thêm người dùng vào một nhóm được sắp xếp cùng với điểm số cao của họ, bạn đã có cho mình một ban lãnh đạo hoàn hảo. Khi điểm cao mới xuất hiện, chỉ cần thêm họ vào tập hợp một lần nữa với điểm cao của họ và nó sẽ sắp xếp lại bảng thành tích của bạn. Cũng tuyệt vời để theo dõi lần cuối cùng người dùng đã truy cập và những người đang hoạt động trong ứng dụng của bạn.
Việc 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 (suy nghĩ theo thứ tự 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 tập hợp được sắp xếp tương tự như lệnh cho tập hợp, đôi khi có thêm một tham số điểm. Ngoài ra còn có 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 lường dữ liệu địa lý. Điều này bao gồm các truy vấn về bán kính và đo khoảng cách giữa các điểm.
Dữ liệu địa lý về mặt kỹ thuật trong redis được lưu trữ trong các tập hợp được sắp xếp, vì vậy đây không phải là một kiểu dữ liệu thực sự riêng biệt. Nó là một tiện ích mở rộng trên các nhóm được sắp xếp.
Bitmap và HyperLogLog
Giống như địa lý, đây không phải là các 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ể nó là một bitmap hoặc một siêu nhật ký.
Bitmap là những toán tử cấp bit mà tôi đã tham chiếu trong Strings
là cho. Loại 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ỏ liên tục để đếm các giá trị duy nhất gần như không giới hạn với độ chính xác đáng kinh ngạc. Chỉ sử dụng ~ 16KB, bạn có thể đếm hiệu quả số lượng khách truy cập vào trang web của mình, ngay cả khi con số đó lên đến hàng triệu.
Giao dịch và tính 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ần chờ đợi giá trị đó được truyền đi. Về mặt kỹ thuật, memcached cũng là nguyên tử, nhưng với việc 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 với 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 lạc quan" (XEM / MULTI / EXEC).
Pipelining
Redis cung cấp một tính năng gọi là 'pipelining'. Nếu bạn có nhiều lệnh redis muốn thực hiện, bạn có thể sử dụng pipelining để gửi chúng đến redis tất cả cùng một lúc thay vì từng lần một.
Thông thường khi bạn thực hiện một lệnh tới 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, trả lờ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 duy nhất.
Điều này có thể cho phép bạn đạt được thông lượng thậm chí còn lớn hơn khi nhập hàng loạt hoặc các hành động khác liên quan đến nhiều lệnh.
Pub / Sub
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 trình truyền tin tốc độ cao. Điều này cho phép một ứng dụng khách xuất bản tin nhắn cho nhiều ứng dụng khách khác được kết nối với một kênh.
Redis thực hiện 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ế trong một số lĩnh 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ỉ liên tục và các cấu trúc dữ liệu khác mà khối lượng công việc pub / sub của bạn có thể cần, Redis thường sẽ chứng minh là công cụ tốt nhất và đơn giản nhất cho công việc.
Lua Scripting
Bạn có thể nghĩ về các tập lệnh lua như SQL của riêng redis hoặc các thủ tục được lưu trữ. Nó vừa nhiều hơn vừa ít hơn thế, nhưng sự tương tự chủ yếu hoạt động.
Có thể bạn có những phép tính phức tạp muốn redis thực hiện. Có thể bạn không đủ khả năng để các giao dịch của mình quay trở lại và cần đảm bảo rằng mọi bước của một quy trình phức tạp sẽ diễn ra một cách nguyên tử. Những vấn đề này và nhiều vấn đề khác có thể được giải quyết bằng tập lệnh 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 vào một tập lệnh lua, bạn thường có thể tránh gặp rắc rối với các giao dịch khóa lạc quan.
Chia tỷ lệ
Như đã đề cập ở trên, redis bao gồm hỗ trợ tích hợp cho phân cụm và được đóng gói với công cụ có tính khả dụng cao của riêng nó được gọi là redis-sentinel
.
Kết luận
Không do dự, tôi khuyên bạn nên xem lại memcached cho bất kỳ dự án mới nào hoặc các dự án hiện có chưa sử dụng memcached.
Ở trên nghe có vẻ như tôi không thích memcached. Ngược lại:nó là một công cụ mạnh mẽ, đơn giản, ổn định, trưởng thành và cứng rắn. Thậm chí có một số trường hợp sử dụng còn nhanh hơn redis một chút. Tôi yêu memcached. Tôi chỉ nghĩ rằng nó không có nhiều ý nghĩa cho sự phát triển trong tương lai.
Redis làm mọi thứ mà memcached làm, thường tốt hơn. Bất kỳ lợi thế hiệu suất nào đối với memcached là nhỏ và khối lượng công việc cụ thể. Cũng có những 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 nhỏ về hiệu suất có vẻ nhỏ khi đối mặt với hố sâu khổng lồ về chức năng và thực tế là cả hai công cụ đều rất nhanh và hiệu quả, chúng rất có thể là phần cuối cùng trong 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 trường hợp mà memcached có ý nghĩa hơn:khi memcached đã được sử dụng làm bộ nhớ đệm. Nếu bạn đã lưu vào bộ nhớ đệm với memcached thì hãy tiếp tục sử dụng nó, nếu nó đáp ứng được nhu cầu của bạn. Việc chuyển sang redis dường như là không đáng và nếu bạn định sử dụng redis chỉ để lưu vào bộ nhớ đệm thì nó có thể không mang lại đủ lợi ích xứng đáng với thời gian của bạn. Nếu memcached không đáp ứng được 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 bộ nhớ đệm hay bạn cần thêm chức năng.