Câu hỏi Memcached vs. Redis?


Chúng tôi đang sử dụng ứng dụng web Ruby với Redis máy chủ cho bộ nhớ đệm. Có một điểm để kiểm tra không Memcached thay thế?

Điều gì sẽ cho chúng ta hiệu suất tốt hơn? Bất kỳ ưu điểm hay nhược điểm nào giữa Redis và Memcached?

Các điểm cần xem xét:

  • Tốc độ đọc / ghi.
  • Sử dụng bộ nhớ.
  • Đĩa I / O bán phá giá.
  • Chia tỷ lệ.

1138
2018-05-11 20:52


gốc


Một phân tích khác ngoài các bình luận dưới đây: Google Xu hướng: redis so với memcached - MarkHu
Một nhận xét không đảm bảo câu trả lời: nếu bạn đang xem các dịch vụ dựa trên đám mây cho hai hệ thống này (ví dụ: addons của heroku) Dịch vụ được ghi nhớ đôi khi khá rẻ hơn một chút cho mỗi MB vì ​​bất kỳ lý do gì. - Ben Roberts
Đối với khả năng mở rộng: Imgur và Twitter sử dụng cả hai - the_red_baron


Các câu trả lời:


Tóm tắt (TL; DR)

Cập nhật ngày 03 tháng 6 năm 2017

Redis mạnh hơn, phổ biến hơn và được hỗ trợ tốt hơn memcached. Memcached chỉ có thể làm một phần nhỏ những thứ Redis có thể làm. Redis là tốt hơn, ngay cả nơi các tính năng của họ chồng lên nhau.

Đố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ụ đều mạnh mẽ, nhanh chóng, trong bộ nhớ lưu trữ dữ liệu 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ộ nhớ cache 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 ra.

Các điểm cần xem xét

Khi được sử dụng cho cùng một điều, dưới đâ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 gốc:

  • 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 hiển thị lại để nhanh hoặc nhanh như memcached. Tôi khuyên bạn nên redis, nhưng không phải vì memcached là chậm. Nó không phải.
  • Sử dụng bộ nhớ: Redis là tốt hơn.
    • memcached: Bạn chỉ định kích thước bộ nhớ đệm và khi bạn chèn các mục daemon 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ự là một cách để đòi lại bất kỳ không gian nào, không 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ể tuôn ra cơ sở dữ liệu, và nó vẫn sẽ sử dụng toàn bộ RAM bạn đã cấu hình nó.
    • redis: Đặt kích thước tối đa tùy thuộc vào bạn. Redis sẽ không bao giờ sử dụng nhiều hơn nó có và sẽ cung cấp cho bạn trở lại bộ nhớ nó không còn sử dụng.
    • Tôi đã lưu trữ các chuỗi 100.000 ~ 2KB (~ 200MB) các câu ngẫu nhiên vào cả hai. Mức sử dụng RAM đã tăng lên ~ 225MB. Redis RAM sử dụng 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ự như cách chúng lưu trữ dữ liệu, nhưng chỉ có một khả năng thu hồi dữ liệu đó.
  • Đĩa I / O bán phá giá: 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 cấu hình. Memcached không có cơ chế để đổ đĩa 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 tấn khoảng không trước khi bạn cần nhiều hơn một ví dụ đơn lẻ làm bộ đệm. Redis bao gồm các công cụ giúp bạn vượt xa đ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à chuỗi tối đa 1MB.

Nó tốt ở đây, nhưng đó là tất cả. 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 xuyên 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 đã 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ứ điều gì quan trọng ở đó.

Nếu bạn cần hiệu suất cao hoặc tính khả dụng cao, có sẵn các công cụ, sản phẩm và dịch vụ của bên thứ ba.

redis

Redis có thể thực hiện các công việc tương tự như memcached, và có thể làm tốt hơn.

Redis can hoạt động như bộ nhớ cache cũng. Nó cũng có thể lưu trữ cặp khóa / giá trị. Trong redis họ thậm chí có thể lên đến 512MB.

Bạn có thể tắt tính kiên trì 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 bạn để sống sót khởi động lại nó cho phép bạn làm điều đó là tốt. Trong thực tế, đó là mặc định.

Đó là siêu nhanh quá, thường bị giới hạn bởi mạng hoặc băng thông bộ nhớ.

Nếu một ví dụ của redis / memcached không đủ hiệu suất cho khối lượng công việc của bạn, redis là sự 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ó sẵn cao (redis-sentinel) đúng "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à 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 quanh redis lớn hơn nhiều. Số lượng triển khai quy mô lớn hiện nay có khả năng lớn hơn đối với memcached.

Redis Superset

Redis là nhiều hơn 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 một cái nhìn tổng quát 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. Phần lớn các tính năng redis 'là những thứ memcached không thể làm được.

Tài liệu

Redis là tài liệu tốt hơn memcached. Trong khi điều này có thể chủ quan, nó có vẻ là nhiều hơn và đúng hơn tất cả các thời gian.

redis.io là một tài nguyên điều hướng dễ dà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 mỗi lệnh trong tài liệu.

Hiện có 2x kết quả stackoverflow nhiều cho redis như memcached. 2x nhiều 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. Những phép đo này có thể không có nghĩa là nhiều cá nhân, nhưng kết hợp chúng vẽ một hình ảnh rõ ràng hỗ trợ và tài liệu cho redis là lớn hơn và nhiều hơn nữa up-to-date.

Kiên trì

Theo mặc định, redis lưu dữ liệu của bạn vào đĩa bằng cách sử dụng cơ chế được 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 với hầu như không có sự suy giảm hiệu suất. Nó gần như miễn phí!

Trong chế độ chụp nhanh có khả năng xảy ra sự cố đột ngột có thể dẫn đến một lượng dữ liệu bị mất nhỏ. Nếu bạn hoàn toàn cần phải chắc chắn rằng không có dữ liệu nào bị mất, đừng lo lắng, redis cũng có mặt của bạn ở đó với chế độ AOF (Nối chỉ tệp). Trong dữ liệu chế độ kiên trì này 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, tuy nhiên đĩa của bạn có thể ghi nhanh, 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 dễ dàng thiết lập lại redis như một nơi an toàn, dư thừa để lưu trữ dữ liệu. Nó là một thực cơ sở dữ liệu.

Nhiều loại dữ liệu

Memcached được giới hạn trong 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 loại dữ liệu đó.

Dây (lệnh)

Văn bản đơn giản hoặc giá trị nhị phân có thể có kích thước tối đa 512MB. Đây là loại dữ liệu duy nhất redis và memcached chia sẻ, mặc dù memcached strings đượ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 bitwise, thao tác mức bit, hỗ trợ tăng / giảm điểm nổi, truy vấn phạm vi và hoạt động đa phím. Memcached không hỗ trợ bất kỳ điều đó.

Các 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 kiểu dữ liệu này một mình.

Hashes (lệnh)

Hashes là loại giống như một cửa hàng giá trị quan trọng trong một cửa hàng giá trị quan trọng. Chúng ánh xạ giữa các trường chuỗi và các giá trị chuỗi. Trường-> giá trị bản đồ bằng cách sử dụng một băm là hơi nhiều không gian hiệu quả hơn so với key-> giá trị bản đồ bằng cách sử dụng các chuỗi thường xuyên.

Các dấu gạch ngang là 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 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, xóa tất cả các thành viên lại với nhau, v.v. Tuyệt vời cho mọi trường hợp sử dụng mà bạn có một số cặp khóa / giá trị cần nhóm.

Một ví dụ sử dụng một băm là để lưu trữ hồ sơ người dùng giữa các ứng dụng. Một băm redis được lưu với ID người dùng là khóa sẽ cho phép bạn lưu trữ nhiều bit dữ liệu về người dùng khi cần thiết trong khi vẫn giữ chúng trong một khóa duy nhất. Lợi thế của việc sử dụng băm thay vì tuần tự hóa cấu hình 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ề 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 theo bộ sưu tập các chuỗi. Chúng được tối ưu hóa để chèn, đọc hoặc xóa các giá trị từ trên cùng hoặc dưới cùng (aka: 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 / mở các mục, đẩy / bật giữa các danh sách, cắt bớt danh sách, thực hiện các truy vấn phạm vi, v.v.

Danh sách làm cho bền, nguyên tử, hàng đợi. Những công việc này 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ệnh)

Bộ là tập hợp các giá trị duy nhất không theo thứ tự. Chúng được tối ưu hóa để cho phép bạn nhanh chóng kiểm tra xem giá trị có nằm trong tập hợp hay không, nhanh chóng thêm / xóa các giá trị và để đo chồng chéo với các bộ khác.

Đây là những điều 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 có cái gì đó tương tự (thường được gọi là Set). Điều này là như vậy, chỉ phân phối.

Redis cung cấp một số lệnh để quản lý bộ. Những người rõ ràng như thêm, xóa và kiểm tra tập hợp 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 công đoàn và nút giao với các bộ khác.

Bộ sắp xếp (lệnh)

Bộ 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 sắp xếp. Chúng được sắp xếp theo điểm số, sau đó theo từ điển.

Kiểu dữ liệu này được tối ưu hóa để tra cứu nhanh theo điểm số. Nhận được các giá trị cao nhất, thấp nhất hoặc bất kỳ 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 xếp hạng 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 lần nữa với điểm số cao và nó sẽ sắp xếp lại bảng xếp hạng 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à ai đ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ừ điển (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 tập hợp được sắp xếp lệnh tương tự như lệnh cho tập hợp, đôi khi có tham số điểm bổ sung. Cũng bao gồm các lệnh để quản lý điểm số và truy vấn theo điểm số.

Geo

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 bán kính và đo khoảng cách giữa các điểm.

Dữ liệu địa lý kỹ thuật trong redis được lưu trữ trong các bộ đượ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 phần mở rộng trên đầu trang của các bộ đượ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à những lệnh cho phép bạn xử lý dữ liệu chuỗi như thể đó là một bitmap hoặc một hyperloglog.

Bitmap là những gì mà các toán tử cấp bit mà tôi tham chiếu dưới Strings là cho. Kiểu dữ liệu này là khối xây dựng cơ bản cho dự án hợp tác nghệ thuật gần đây của reddit: r / Địa điểm.

HyperLogLog cho phép bạn sử dụng một lượng không gian cực kỳ nhỏ để đếm gần như không giới hạn các giá trị độc đáo 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 một cách hiệu quả vào trang web của bạn, ngay cả khi con số đó là hàng triệu.

Giao dịch và Atomicity

Lệnh redis là nguyên tử, có nghĩa là bạn có thể chắc chắn rằng ngay sau khi bạn viết một giá trị để redis giá trị đó là hiển thị cho tất cả các khách hàng kết nối với redis. Không có chờ đợi cho giá trị đó để tuyên truyền. Về mặt kỹ thuật memcached là nguyên tử là tốt, nhưng với redis thêm tất cả các chức năng này ngoài memcached nó là đáng chú ý và hơi ấn tượng rằng tất cả các loại dữ liệu bổ sung và các tính năng cũng 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ó giao dịch sử dụng "khóa lạc quan" (ĐỒNG HỒ ĐEO TAY/MULTI/EXEC).

Đường ống

Redis cung cấp một tính năng được gọi là 'đường ống'. Nếu bạn có nhiều lệnh redis bạn muốn thực thi, bạn có thể sử dụng pipelining để gửi chúng tới redis all-at-once thay vì một lần.

Thông thường, khi bạn thực hiện một lệnh để redis hoặc memcached, mỗi lệnh là một chu kỳ yêu cầu / đáp ứng 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 câu trả lời cho tất cả các lệnh của bạn trong một câu trả lời đơn.

Điều này có thể cho phép bạn đạt được thông lượng lớn hơn nhiều 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ó lệnh dành riêng cho chức năng pub / sub, cho phép redis hoạt động như một đài truyền thông tốc độ cao. Điều này cho phép một khách hàng duy nhất 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 làm pub / sub cũng như hầu như bất kỳ công cụ nào. 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 vững và các cấu trúc dữ liệu khác mà khối lượng công việc phụ của bạn có thể cần, Redis thường sẽ 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ề lua script giống như các thủ tục lưu trữ hoặc SQL riêng của redis. Đó là cả hai và ít hơn thế, nhưng tương tự chủ yếu là làm việc.

Có thể bạn có các phép tính phức tạp mà bạn muốn redis thực hiện. Có lẽ bạn không thể đủ khả năng để có các giao dịch của bạn quay trở lại và cần đảm bảo mỗi bước của một quá trình phức tạp sẽ xảy ra 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 kịch bản lệnh lua.

Toàn bộ kịch bản được thực thi nguyên tử, vì vậy nếu bạn có thể phù hợp với logic của bạn thành một kịch bản lệnh lua bạn thường có thể tránh rối tung 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ạo nhóm và được tích hợp sẵn công cụ có sẵn cao của riêng nó redis-sentinel.

Phần kết luận

Không do dự, tôi sẽ khuyên bạn nên redis over memcached cho bất kỳ dự án mới, hoặc các dự án hiện tại mà đã không sử dụng memcached.

Ở trên có thể âm thanh 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. Thậm chí còn 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 nhiều cho sự phát triển trong tương lai.

Redis làm mọi thứ memcached, 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ẽ được nhanh hơn, và nhiều khối lượng công việc mà redis có thể làm mà memcached chỉ đơn giản là không thể. Sự khác biệt nhỏ về hiệu năng dường như rất nhỏ khi đối mặt với vịnh khổng lồ trong chức năng và thực tế là cả hai công cụ đều rất nhanh và hiệu quả, chúng có thể là phần cuối cùng của cơ sở hạ tầng 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 như một bộ nhớ đệm. Nếu bạn đã được bộ nhớ đệm với memcached sau đó tiếp tục sử dụng nó, nếu nó đáp ứng nhu cầu của bạn. Nó có khả năng không có giá trị nỗ lực để chuyển sang redis và nếu bạn đang sử dụng redis chỉ cho bộ nhớ đệm nó có thể không cung cấp đủ lợi ích để có giá trị 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 phải vượt quá quy mô memcached hoặc bạn cần chức năng bổ sung.


1642
2018-06-29 06:54



Làm thế nào Memcached cung cấp phân cụm theo cách tồn tại trong chính máy chủ? Tôi đã luôn luôn sử dụng các thư viện được phân phối cho một nhóm các máy chủ memcached bằng cách sử dụng các thuật toán băm hoặc một mô-đun. Điều tương tự cũng được nói cho Redis. Tôi chủ yếu sử dụng Python và có vẻ là khá một vài mô-đun mà không dựa vào thư viện memcached để xử lý các hồ bơi kết nối. - whardier
"Giao dịch với khóa lạc quan (WATCH / MULTI / EXEC)" - Redis không có giao dịch đúng. I E. nếu [multi, cmd1, cmd2, cmd3 (exception), exec] thì cmd1 và cmd2 sẽ được thực hiện. - Oleg
@Oleg đó không phải là thực sự đúng sự thật. Nếu bạn sử dụng multi-exec các lệnh được đệm (tức là: không được thực hiện) cho đến khi exec xảy ra, vì vậy nếu bạn có một ngoại lệ trước khi exec thì không có lệnh nào được thực thi. Nếu exec được gọi là tất cả các lệnh đệm được thực thi nguyên tử, trừ khi, tất nhiên, một biến đồng hồ đã được thay đổi kể từ khi đa được gọi đầu tiên. Cơ chế thứ hai này là phần khóa lạc quan. - Carl Zulauf
@whardier Bạn đúng. Đã cập nhật câu trả lời để phản ánh cụm từ "hỗ trợ" của memcached được bật bằng các công cụ bổ sung. Nên nghiên cứu tốt hơn. - Carl Zulauf
làm thế nào về clustering với máy chủ couchbase? (tương thích memcached) - Ken Liu


Sử dụng Redis nếu

  1. Bạn yêu cầu xóa / hết hạn các mục có chọn lọc trong bộ nhớ cache. (Bạn cần cái này)

  2. Bạn yêu cầu khả năng truy vấn các khóa của một loại cụ thể. eq. 'blog1: bài đăng: *', 'blog2: danh mục: xyz: bài đăng: *'. ồ vâng! cái này rất quan trọng. Sử dụng tùy chọn này để vô hiệu hóa một số loại mục được lưu trong bộ nhớ cache nhất định. Bạn cũng có thể sử dụng điều này để vô hiệu hóa bộ nhớ cache phân đoạn, bộ nhớ cache trang, chỉ đối tượng AR của một loại đã cho, v.v.

  3. Sự kiên trì (Bạn cũng sẽ cần đến điều này, trừ khi bạn đồng ý với bộ nhớ cache của bạn phải khởi động sau mỗi lần khởi động lại. Rất cần thiết cho các đối tượng ít khi thay đổi)

Sử dụng memcached nếu

  1. Memcached mang đến cho bạn headached!
  2. umm ... phân cụm? meh. nếu bạn đi xa như vậy, hãy sử dụng Varnish và Redis để lưu trữ các mảnh vỡ và AR Objects.

Theo kinh nghiệm của tôi, tôi đã ổn định hơn nhiều với Redis hơn là Memcached


128
2017-07-05 06:04



Tài liệu Redis nói rằng việc sử dụng các mẫu yêu cầu quét bảng. blog1: posts: * có thể yêu cầu quét bảng O (N). Tất nhiên, nó vẫn còn nhanh trên các bộ dữ liệu có kích thước hợp lý, vì Redis nhanh. Nó sẽ là OK để thử nghiệm hoặc quản trị. - wisty
Headached là một trò đùa, phải không? :-) Tôi googled cho memcached headached nhưng không tìm thấy bất cứ điều gì hợp lý. (Tôi mới đến Memcached và Redis) - KajMagnus
bình chọn xuống cho cùng một lý do hơn @pellucide. Redis có thể tốt hơn Memcached, nhưng Memcached là tầm thường để sử dụng. Tôi chưa bao giờ gặp vấn đề với nó và nó không tầm thường để cấu hình. - Diego Jancic
Cảm ơn bạn @KajMagnus vì đã làm cho ngày của tôi .. có thể cả tuần của tôi - alex


Memcached là đa luồng và nhanh chóng.

Redis có rất nhiều tính năng và rất nhanh, nhưng hoàn toàn bị giới hạn ở một lõi vì nó dựa trên vòng lặp sự kiện.

Chúng tôi sử dụng cả hai. Memcached được sử dụng cho bộ nhớ đệm đối tượng, chủ yếu là giảm tải đọc trên cơ sở dữ liệu. Redis được sử dụng cho những thứ như các bộ được sắp xếp thuận tiện cho việc cuộn dữ liệu chuỗi thời gian.


76
2018-05-03 16:41



Trang web có lưu lượng truy cập cao được đầu tư nhiều vào memcached và có tắc nghẽn db về "hồ sơ người dùng" giống như dữ liệu phi quan hệ nên đánh giá couchbase song song với Mongo thông thường, Redis - Barry
@siliconrockstar - chắc chắn Redis 3 vẫn là lõi đơn; ít nhất AWS Redis (sử dụng 3.2.6 hoặc 3.2.10) cảnh báo tính đến điều đó khi xem xét ví dụ Số liệu EngineCpuUtilization - dwanderson
Có vẻ như bạn nói đúng, tôi nghĩ rằng khi tôi đưa ra nhận xét đó, tôi đã dựa trên những nguồn không đầy đủ. Đã xóa nhận xét. - siliconrockstar
nhưng bạn vẫn có thể khởi chạy phiên bản $ core_count của Redis - Imaskar


Đây là quá dài để được đăng dưới dạng nhận xét cho câu trả lời đã được chấp nhận, vì vậy tôi đặt câu trả lời đó thành câu trả lời riêng

Một điều cũng cần xem xét là liệu bạn có mong đợi có giới hạn bộ nhớ cứng trên bộ nhớ cache của bạn hay không.

Kể từ redis là một cơ sở dữ liệu nosql với tấn các tính năng và bộ nhớ đệm chỉ là một lựa chọn nó có thể được sử dụng cho, nó phân bổ bộ nhớ như nó cần nó - các đối tượng bạn đưa vào nó, bộ nhớ nhiều hơn nó sử dụng. Các maxmemory tùy chọn không thực thi nghiêm ngặt việc sử dụng giới hạn bộ nhớ trên. Khi bạn làm việc với bộ nhớ cache, các phím bị đuổi và hết hạn; cơ hội là chìa khóa của bạn không phải là tất cả cùng kích thước, do đó, phân mảnh bộ nhớ nội bộ xảy ra.

Theo mặc định, redis sử dụng jemalloc bộ cấp phát bộ nhớ, cố gắng hết sức để có cả bộ nhớ nhỏ gọn và nhanh chóng, nhưng nó là bộ cấp phát bộ nhớ có mục đích chung và nó không thể theo kịp với rất nhiều phân bổ và đối tượng đang diễn ra với tốc độ cao. Bởi vì điều này, trên một số mô hình tải redis quá trình có thể dường như rò rỉ bộ nhớ vì phân mảnh nội bộ. Ví dụ, nếu bạn có một máy chủ với 7 Gb RAM và bạn muốn sử dụng redis như bộ nhớ cache LRU không liên tục, bạn có thể thấy rằng quá trình redis với maxmemory thiết lập để 5Gb theo thời gian sẽ sử dụng nhiều hơn và nhiều hơn nữa bộ nhớ, cuối cùng nhấn tổng số giới hạn RAM cho đến khi kẻ giết người out-of-bộ nhớ can thiệp.

memcached phù hợp hơn với kịch bản được mô tả ở trên, vì nó quản lý bộ nhớ của nó theo một cách hoàn toàn khác. memcached phân bổ một phần lớn bộ nhớ - mọi thứ nó sẽ cần - và sau đó tự quản lý bộ nhớ này, bằng cách sử dụng bộ nhớ riêng của nó -bộ phân bổ sàn. Hơn nữa, memcached cố gắng hết sức để giữ cho phân mảnh nội bộ thấp, vì nó thực sự sử dụng thuật toán LRU trên mỗi slab, khi việc trục xuất LRU được thực hiện với kích thước đối tượng được xem xét.

Với điều đó đã nói, memcached vẫn có một vị trí mạnh mẽ trong môi trường, nơi sử dụng bộ nhớ phải được thực thi và / hoặc có thể dự đoán được. Chúng tôi đã cố gắng sử dụng redis ổn định mới nhất (2.8.19) như là một thay thế memcached dựa trên LRU không liên tục trong khối lượng công việc 10-15k op / s, và nó bị rò rỉ bộ nhớ A LOT; khối lượng công việc tương tự đã làm sụp đổ các trường hợp redast ElastiCache của Amazon trong một ngày hoặc lâu hơn vì cùng một lý do.


68
2018-03-02 11:13



Từ redis.io/topics/faq: Redis có tính năng bảo vệ tích hợp cho phép người dùng đặt giới hạn tối đa cho việc sử dụng bộ nhớ, sử dụng tùy chọn maxmemory trong tệp cấu hình để đặt giới hạn cho bộ nhớ Redis có thể sử dụng. Nếu giới hạn này đạt tới Redis sẽ bắt đầu trả lời với lỗi để viết lệnh (nhưng sẽ tiếp tục chấp nhận lệnh chỉ đọc) hoặc bạn có thể định cấu hình để xóa khóa khi giới hạn bộ nhớ tối đa đạt được trong trường hợp bạn đang sử dụng Redis cho bộ nhớ đệm. Chúng tôi có tài liệu nếu bạn dự định sử dụng Redis làm bộ nhớ cache LRU.  liên kết - StefanNch
@StefanNch redis ' maxmemory tùy chọn không tính đến phân mảnh bộ nhớ trong. Xin vui lòng xem bình luận của tôi ở trên để biết chi tiết - những vấn đề tôi đã mô tả đã được nhìn thấy trong kịch bản được mô tả trong "Redis như một bộ nhớ cache LRU" trang với các tùy chọn hạn chế bộ nhớ được kích hoạt. memcached, ở phía bên kia, sử dụng cách tiếp cận khác nhau để tránh vấn đề phân mảnh bộ nhớ, do đó, giới hạn bộ nhớ của nó là nhiều hơn "cứng". - artyom


Memcached là tốt tại là một cửa hàng khóa / giá trị đơn giản và là tốt tại làm key => STRING. Điều này làm cho nó thực sự tốt cho việc lưu trữ phiên.

Redis là tốt tại làm key => SOME_OBJECT.

Nó thực sự phụ thuộc vào những gì bạn sẽ được đưa vào đó. Sự hiểu biết của tôi là về mặt hiệu suất, chúng thậm chí còn khá tốt.

Cũng may mắn tìm thấy bất kỳ điểm chuẩn khách quan, nếu bạn tìm thấy một số vui lòng gửi cho họ theo cách của tôi.


44
2018-05-11 23:27



IMO Redis Hash kiểu dữ liệu làm cho rất nhiều ý nghĩa hơn để lưu trữ các biến phiên hơn serializing chúng thành một chuỗi memcached. - Carl Zulauf
Nếu bạn quan tâm đến trải nghiệm người dùng, không đặt các phiên của bạn trong bộ nhớ cache. dormando.livejournal.com/495593.html - sleblanc
@sebleblanc Điều này không nên là một vấn đề với Redis tuy nhiên kể từ khi có đĩa persistency là tốt. - haknick
@sebleblanc memcache vẫn còn tốt tại phiên lưu trữ bạn thực hiện nó kém hay không. có trục xuất là một vấn đề nhưng không phải trong anyway không thể vượt qua, cũng không phải là vấn đề của memcache nếu bạn không lo lắng về việc trục xuất. Hầu hết các giải pháp phiên memcache sử dụng cookie như một bản sao lưu tôi tin. - Erik Petersen
"Không đặt các phiên của bạn trong bộ nhớ cache" là gây hiểu lầm. Ý của bạn là "Không chỉ lưu trữ các phiên của bạn trong bộ nhớ cache". Bất cứ ai lưu trữ dữ liệu quan trọng trong memcache chỉ nên được kích hoạt ngay lập tức. - Jacob


Nếu bạn không nhớ một phong cách viết crass, Redis vs Memcached trên blog Systoilet có giá trị đọc từ một quan điểm khả năng sử dụng, nhưng hãy chắc chắn đọc qua lại trong các ý kiến ​​trước khi đưa ra bất kỳ kết luận nào về hiệu suất; có một số vấn đề về phương pháp luận (các bài kiểm tra vòng lặp luồng đơn luồng) và Redis đã thực hiện một số cải tiến kể từ khi bài viết được viết.

Và không có liên kết điểm chuẩn nào hoàn thành mà không gây nhầm lẫn một chút, vì vậy hãy kiểm tra một số điểm chuẩn xung đột tại LiveJournal của Dormondo và Antirez Weblog.

Chỉnh sửa - như Antirez chỉ ra, phân tích Systoilet là khá bị hình thành. Thậm chí ngoài sự thiếu hụt luồng đơn, phần lớn sự khác biệt về hiệu năng trong các điểm chuẩn đó có thể được quy cho các thư viện máy khách chứ không phải là thông lượng máy chủ. Các tiêu chuẩn tại Antirez Weblog thực sự trình bày một nhiều hơn nữa táo-to-táo (với cùng một miệng) so sánh.


36
2018-06-15 22:38



các Redis vs Memcached điểm chuẩn bị ốm.oldblog.antirez.com/post/redis-memcached-benchmark.html - App Work
Bạn không đùa giỡn về sự thô tục. - ocodo
Hơn cả năm 2010, blog đã lỗi thời - Siddharth


Tôi đã có cơ hội sử dụng cả memcached và redis cùng nhau trong proxy caching mà tôi đã làm việc trên, hãy để tôi chia sẻ bạn, nơi chính xác tôi đã sử dụng những gì và lý do đằng sau cùng ....

Redis>

1) Được sử dụng để lập chỉ mục nội dung bộ nhớ cache, qua cụm. Tôi có hơn một tỷ phím trong sự lây lan trên các cụm redis, thời gian đáp ứng redis là khá ít và ổn định.

2) Về cơ bản, một cửa hàng khóa / giá trị của nó, vì vậy khi bạn ứng dụng bạn có một cái gì đó tương tự, người ta có thể sử dụng redis với nhiều phiền toái.

3) Redis persistency, failover và backup (AOF) sẽ giúp công việc của bạn dễ dàng hơn.

Memcache>

1) có, bộ nhớ được tối ưu hóa có thể được sử dụng làm bộ nhớ cache. Tôi đã sử dụng nó để lưu trữ nội dung bộ nhớ cache nhận được truy cập rất thường xuyên (với 50 lần truy cập / giây) với kích thước nhỏ hơn 1 MB.

2) Tôi chỉ phân bổ 2GB trong số 16 GB cho memcached rằng quá khi kích thước nội dung duy nhất của tôi là> 1MB.

3) Khi nội dung phát triển gần các giới hạn, đôi khi tôi đã quan sát thấy thời gian phản hồi cao hơn trong các số liệu thống kê (không phải là trường hợp với redis).

Nếu bạn yêu cầu trải nghiệm tổng thể Redis có nhiều màu xanh lá cây vì nó dễ cấu hình, linh hoạt hơn với các tính năng mạnh mẽ ổn định.

Hơn nữa, có một kết quả điểm chuẩn có sẵn tại đây liên kết , dưới đây là vài higlight từ cùng một,

enter image description here

enter image description here

Hi vọng điêu nay co ich!!


18
2017-10-16 10:20





Một tiền thưởng khác là nó có thể rất rõ ràng memcache sẽ hoạt động như thế nào trong một kịch bản bộ nhớ đệm, trong khi redis thường được sử dụng như một kho dữ liệu liên tục, mặc dù nó có thể được cấu hình để hoạt động giống như memcached aka evicting Least Recent Used items khi nó đạt đến max sức chứa.

Một số ứng dụng tôi đã sử dụng để chỉ rõ cách chúng tôi dự định dữ liệu hoạt động - công cụ trong memcache, chúng tôi viết mã để xử lý các trường hợp không có ở đó - công cụ trong redis, chúng tôi dựa vào nó .

Khác hơn là Redis thường được coi là cấp trên cho hầu hết các trường hợp sử dụng được nhiều tính năng phong phú và do đó linh hoạt.


11
2017-07-04 12:42





Kiểm tra. Chạy một số điểm chuẩn đơn giản. Trong một thời gian dài, tôi coi bản thân mình là một con tê giác học cũ từ khi tôi sử dụng chủ yếu là memcached và coi Redis là đứa trẻ mới.

Với công ty Redis hiện tại của tôi đã được sử dụng làm bộ đệm chính. Khi tôi đào sâu vào một số thống kê hiệu suất và chỉ đơn giản là bắt đầu thử nghiệm, Redis, về hiệu suất, so sánh hoặc tối thiểu chậm hơn so với MySQL.

Memcached, mặc dù đơn giản, thổi Redis ra khỏi nước hoàn toàn. Nó thu nhỏ tốt hơn nhiều:

  • cho các giá trị lớn hơn (yêu cầu thay đổi kích thước sàn, nhưng đã hoạt động)
  • cho nhiều yêu cầu đồng thời

Ngoài ra, chính sách đuổi theo memcached là theo quan điểm của tôi, thực hiện tốt hơn nhiều, dẫn đến thời gian phản hồi trung bình ổn định hơn trong khi xử lý nhiều dữ liệu hơn so với bộ nhớ cache có thể xử lý.

Một số điểm chuẩn tiết lộ rằng Redis, trong trường hợp của chúng tôi, thực hiện rất kém. Điều này tôi tin rằng phải làm với nhiều biến:

  • loại phần cứng bạn chạy Redis
  • loại dữ liệu bạn lưu trữ
  • lượng và bộ
  • cách ứng dụng của bạn đồng thời
  • bạn có cần lưu trữ cấu trúc dữ liệu không

Cá nhân, tôi không chia sẻ xem các tác giả Redis có trên đồng thời và đa luồng.


11
2017-11-13 08:14



hãy giải thích "chậm hơn so với MySQL." - Anirudha Gupta
Truty được cho biết tôi không có dữ liệu điểm chuẩn này trong tay nhưng trường hợp cụ thể đó là rất nhiều công cụ đọc / ghi - mdomans


Nó sẽ không sai, nếu chúng ta nói rằng redis là sự kết hợp của (cache + data structure) trong khi memcached chỉ là một cache.


9
2018-06-16 05:45



đây là câu trả lời hay - Laravel đang sử dụng redis làm bộ đệm và làm cơ chế lưu trữ dữ liệu - carousel