Redis và Memcache hay chỉ Redis?


85

Tôi đang sử dụng memcached cho một số bộ nhớ đệm trong ứng dụng Rails 3 của mình thông qua Rails.cachegiao diện đơn giản và bây giờ tôi muốn thực hiện một số xử lý công việc nền với redis và resque.

Tôi nghĩ rằng chúng đủ khác nhau để đảm bảo sử dụng cả hai. Tuy nhiên, trên heroku, có những khoản phí riêng để sử dụng cả memcached và redis. Sử dụng cả hai có hợp lý không hay tôi nên chuyển sang chỉ sử dụng redis?

Tôi thích sử dụng memcached để lưu vào bộ nhớ đệm vì các khóa ít được sử dụng gần đây nhất sẽ tự động được đẩy ra khỏi bộ nhớ cache và tôi không cần dữ liệu bộ nhớ cache để tồn tại. Redis chủ yếu là mới đối với tôi, nhưng tôi hiểu rằng nó ổn định theo mặc định và các khóa không tự động hết hạn trong bộ nhớ cache.

CHỈNH SỬA: Chỉ muốn rõ ràng hơn với câu hỏi của tôi. Tôi biết chỉ sử dụng Redis thay vì cả hai là khả thi. Tôi đoán tôi chỉ muốn biết nếu làm như vậy có bất lợi cụ thể nào không? Xem xét cả việc triển khai và cơ sở hạ tầng, có bất kỳ lý do nào khiến tôi không nên chỉ sử dụng Redis không? (Tức là, memcached có nhanh hơn cho bộ nhớ đệm đơn giản không?) Tôi cũng không tìm thấy bất cứ điều gì dứt khoát.


5
Đối với bất kỳ ai khác đang xem xét điều này: Có một plugin redis-store cho rails cho phép bạn sử dụng redis làm kho lưu trữ bộ nhớ cache.
markquezada

Câu trả lời:


49

Giả sử rằng việc chuyển từ memcached sang redis cho bộ nhớ đệm mà bạn đã làm là đủ dễ dàng, tôi chỉ sử dụng redis để giữ mọi thứ đơn giản.

Trong redis, tính kiên trì là tùy chọn, vì vậy bạn có thể sử dụng nó giống như memcached nếu đó là những gì bạn muốn. Bạn thậm chí có thể thấy rằng làm cho bộ nhớ cache của bạn liên tục rất hữu ích để tránh bỏ lỡ nhiều bộ nhớ cache sau khi khởi động lại. Ngày hết hạn cũng có sẵn - thuật toán hơi khác với memcached, nhưng không đủ quan trọng cho hầu hết các mục đích - hãy xem http://redis.io/commands/expire để biết chi tiết.


1
Cảm ơn câu trả lời và các tài liệu liên quan. Tôi đã chỉnh sửa câu hỏi của mình một chút để làm rõ hơn những gì tôi đang tìm kiếm. Tôi đã không nghĩ về sự tồn tại của bộ nhớ cache sau khi khởi động lại ... đó là một tính năng hay. (Mặc dù tôi không chắc chắn như thế nào hữu ích nó đang xem xét Tôi muốn được sử dụng redis đi với Heroku.)
markquezada

1
Nếu bạn muốn giữ một số mục tạm thời (bộ nhớ đệm phân mảnh) và một số mục liên tục trong redis, bạn có cần tạo hai phiên bản redis riêng biệt không?
Brian Armstrong,

1
Trong khi chúng tôi sử dụng Redis cho cả hàng đợi công việc và bộ nhớ cache, chúng tôi chạy chúng với các cấu hình khác nhau vì những lý do cụ thể mà @BrianArmstrong nêu. Bộ nhớ đệm là tạm thời vì vậy chúng tôi cấu hình nó với tốc độ nhanh, nhưng việc mất mọi thứ trong bộ nhớ và giảm LRU thì không sao. Đối với hàng đợi, chúng tôi thực sự không muốn mất công việc vì vậy chúng tôi định cấu hình nó một cách bền bỉ để nó có thể khôi phục được.
jwadsack

@jwadsack bạn có một bài đăng cho biết cách bạn triển khai cấu hình này không?
Marklar

1
@Marklar Ý kiến ​​hay. Tôi làm bây giờ: ballardhack.wordpress.com/2015/09/30/…
jwadsack 30/09/15

44

Tôi là tác giả của redis-store , không cần phải sử dụng trực tiếp các lệnh Redis, chỉ cần sử dụng :expires_intùy chọn như sau:

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

Ưu điểm của việc sử dụng Redis là độ nhanh và với viên ngọc của tôi, là bạn đã có cửa hàng cho Rack::Cache , Rails.cachehoặc I18n.


Cảm ơn vì đã trả lời Luca. Tôi cho rằng bạn có thể ghi đè: expires_in trực tiếp khi bạn cần lưu trữ nội dung nào đó liên tục? Tôi đoán câu hỏi thực sự là về việc sử dụng cả chức năng loại memcached sử dụng redis như một kho lưu trữ liên tục song song với nhau.
markquezada

3
Tôi không nghĩ là hợp lý khi có cả memcached và redis bên cạnh, vì chúng nằm trong cùng một phân khúc NoSQL: cả hai đều là cửa hàng ak / v. Redis PROS: 1. nhanh hơn memcached 2. nhiều lệnh mạnh hơn 3. không cần khởi động bộ nhớ cache 4. hữu ích để giải quyết các vấn đề khác (ví dụ: hàng đợi với Resque) LƯU Ý: 1. bạn cần một viên ngọc bên ngoài 2. sau khi khởi động lại, máy chủ không chấp nhận các lệnh trong khi đọc dữ liệu từ tệp phụ kiện Memcached PROS: được nướng trong Rails CONS: 1. chậm hơn Redis 2. cache warmup.
Luca Guidi

3
@LucaGuidi Tôi hiện đang sử dụng RedisStore cho bộ nhớ cache Rails của mình. Tôi không thể tìm ra cách đặt cả URL Redis mặc định :expires_in. Bạn có thể giúp?
Chris Vincent

Giống như tôi, Nếu bạn đang gặp sự cố cài đặt :expires_inbằng cách sử dụng redis_store, hãy tham khảo stackoverflow.com/questions/20907247/…
Anirudhan J

19

Tôi đã thấy một số trang web đường ray lớn sử dụng cả Memcached và Redis. Memcached được sử dụng cho những thứ phù du để giữ nóng trong bộ nhớ nhưng có thể bị mất / tái tạo nếu cần và Redis để lưu trữ lâu dài. Cả hai đều được sử dụng để gỡ bỏ DB chính để đọc / ghi các hoạt động nặng.

Thêm chi tiết:

Đã ghi nhớ: được sử dụng cho bộ đệm trang / phân mảnh / phản hồi và bạn có thể đạt giới hạn bộ nhớ trên Memcached vì nó sẽ LRU (ít được sử dụng gần đây nhất) để hết hạn nội dung cũ và thường xuyên giữ nóng các phím đã truy cập trong bộ nhớ. Điều quan trọng là mọi thứ trong Memcached có thể được tạo lại từ DB nếu cần (nó không phải là bản sao duy nhất của bạn). Nhưng bạn có thể tiếp tục đổ mọi thứ vào đó và Memcached sẽ tìm ra cái nào được sử dụng thường xuyên nhất và giữ cho chúng luôn nóng trong bộ nhớ. Bạn không phải lo lắng về việc xóa mọi thứ khỏi Memcached.

redis: bạn sử dụng cái này cho dữ liệu mà bạn không muốn mất và đủ nhỏ để vừa với bộ nhớ. Điều này thường bao gồm các công việc resque / sidekiq, bộ đếm giới hạn tỷ lệ, kết quả thử nghiệm phân tách hoặc bất kỳ thứ gì mà bạn không muốn mất / tạo lại. Bạn không muốn vượt quá giới hạn bộ nhớ ở đây, vì vậy bạn phải cẩn thận hơn một chút về những gì bạn lưu trữ và dọn dẹp sau này.

Redis bắt đầu gặp vấn đề về hiệu suất khi nó vượt quá giới hạn bộ nhớ (hãy sửa cho tôi nếu tôi sai). Có thể giải quyết vấn đề này bằng cách định cấu hình Redis hoạt động như Memcached và LRU những thứ hết hạn, vì vậy nó không bao giờ đạt đến giới hạn bộ nhớ. Nhưng bạn sẽ không muốn làm điều này với mọi thứ bạn đang giữ trong Redis, chẳng hạn như xếp lại công việc. Vì vậy, thay vì mọi người thường giữ mặc định, Rails.cache thiết lập sử dụng Memcached (sử dụng dalligem). Và sau đó họ giữ một biến toàn cục $ redis = ... riêng biệt để thực hiện các hoạt động redis.

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

Có thể có một cách dễ dàng để thực hiện tất cả điều này trong Redis - có lẽ bằng cách có hai phiên bản Redis riêng biệt, một phiên bản có giới hạn bộ nhớ cứng LRU, tương tự như Memcache và một phiên bản khác để lưu trữ liên tục? Tôi chưa thấy điều này được sử dụng, nhưng tôi đoán nó sẽ khả thi.


15

Tôi sẽ cân nhắc kiểm tra câu trả lời của mình về chủ đề này:

Rails và caching, có dễ dàng chuyển đổi giữa memcache và redis không?

Về cơ bản, thông qua kinh nghiệm của mình, tôi sẽ ủng hộ việc giữ chúng riêng biệt: memcached cho bộ nhớ đệm và redis cho cấu trúc dữ liệu và lưu trữ lâu dài hơn


Mặc dù ban đầu tôi dự định củng cố chúng dựa trên câu trả lời ban đầu cho câu hỏi của mình, nhưng về cơ bản tôi đã đi đến kết luận giống nhau. Tôi đang sử dụng memcache cho bộ nhớ đệm cơ bản và redis để gọi lại.
markquezada

6

Tôi đã hỏi nhóm tại Redis Labs (những người cung cấp các tiện ích bổ sung Memcached CloudRedis Cloud ) về sản phẩm mà họ sẽ đề xuất cho bộ nhớ đệm Rails. Họ nói rằng nói chung họ sẽ giới thiệu Redis Cloud, rằng Memcached Cloud chủ yếu được cung cấp cho các mục đích cũ và chỉ ra rằng dịch vụ Memcached Cloud của họ trên thực tế được xây dựng trên Redis Cloud.


Vì vậy, không cần cả memcached và redis như đã đề cập trong câu trả lời của Brian? "mọi người thường giữ bộ Rails.cache mặc định để sử dụng memcached (sử dụng gem dalli). Và sau đó, họ giữ một biến toàn cục $ redis = ... riêng biệt để thực hiện các hoạt động redis."
Marklar

4

Tôi không biết bạn đang sử dụng chúng để làm gì, nhưng thực sự sử dụng cả hai có thể mang lại cho bạn lợi thế về hiệu suất: Memcached có hiệu suất chạy trên nhiều lõi tốt hơn nhiều so với Redis, vì vậy, lưu trữ dữ liệu quan trọng nhất bằng Memcached và giữ phần còn lại trong Redis , tận dụng các khả năng của nó làm cơ sở dữ liệu, có thể tăng hiệu suất.


1
Điều đó không hoàn toàn đúng - redis sử dụng nhiều phiên bản chứ không phải nhiều luồng, vì vậy so sánh một phiên bản redis lõi đơn với một phiên bản memcached đa lõi không phải là một thử nghiệm đặc biệt thích hợp. Bên cạnh đó, khi các điểm chuẩn có sẵn cho thấy cả hai hệ thống là nhanh nhất, sự khác biệt khó có thể thành vấn đề trong thế giới thực.
Tom Clarkson,

Quá trình tiếp cận đa của redis quy mô tốt hơn trên các hệ thống đa lõi hơn (mặc định) Cách tiếp cận của memcached với multi-threading: antirez.com/post/update-on-memcached-redis-benchmark.html
Ludger Sprenker

3
Thiếu sót lớn này của Redis thực sự bị đánh giá thấp rất nhiều. Nếu bạn đang tìm kiếm tính đồng thời cao và có nhiều lõi, Memcached có thể chạy vòng quanh Redis. Sharding không phải là một giải pháp tốt vì bạn phải thực hiện băm nhất quán trong ứng dụng của mình và bạn sẽ không có được sự phân phối hoàn hảo giữa các phiên bản Redis. Ví dụ: nếu phân đoạn A lưu trữ cấu hình ứng dụng của bạn được sử dụng trong mọi yêu cầu, phân đoạn A sẽ nhận được nhiều yêu cầu hơn các phân đoạn khác không được truy cập cho mọi yêu cầu.
ColinM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.