Redis i Memcache czy tylko Redis?

Używam memcached do buforowania w mojej aplikacji Rails 3 poprzez prosty interfejs Rails.cache i teraz chciałbym wykonać pewne przetwarzanie zadań w tle z redis i resque.

Myślę, że są na tyle różne, by nakazać użycie obu. Na heroku są jednak osobne opłaty za korzystanie z memcached i redis. Czy jest sens używać obu, czy powinienem migrować do tylko przy użyciu redis?

Lubię używać memcached do buforowania, ponieważ ostatnio używane klucze są automatycznie wypychane pamięci podręcznej i nie potrzebuję danych pamięci podręcznej do utrzymywania. Redis jest dla mnie w większości nowy, ale rozumiem, że domyślnie jest trwały i że klucze nie wygasają automatycznie z pamięci podręcznej.

EDIT: chciałem tylko wyjaśnić moje pytanie. Wiem, że możliwe jest użycie tylko Redis zamiast obu. Chyba chcę tylko wiedzieć, czy są w tym jakieś wady? Biorąc pod uwagę zarówno implementację, jak i infrastrukturę, czy są jakieś powody, dla których nie powinienem używać Redis? (Czyli czy memcached jest szybszy dla prostego buforowania?) I tak nie znalazłem niczego definitywnego.

Author: markquezada, 2010-11-15

6 answers

Zakładając, że migracja z memcached do redis w celu buforowania, które już wykonujesz, jest wystarczająco łatwa, wybrałbym redis tylko po to, aby wszystko było proste.

W redis trwałość jest opcjonalna, więc możesz jej używać podobnie jak memcached, jeśli tego chcesz. Może nawet okazać się, że uczynienie pamięci podręcznej trwałym jest przydatne, aby uniknąć wielu błędów pamięci podręcznej po ponownym uruchomieniu. Expiry jest również dostępne - algorytm jest nieco inny niż memcached, ale nie na tyle, aby mieć znaczenie dla większości celów-zobacz http://redis.io/commands/expire Po szczegóły.

 48
Author: Tom Clarkson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-09 22:39:37

Jestem autorem redis-store , nie ma potrzeby używania bezpośrednio poleceń Redis, wystarczy użyć opcji :expires_in w ten sposób:

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

Zaletą korzystania z Redis jest trwałość, a z moim klejnotem, jest to, że masz już sklepy dla Rack::Cache, Rails.cache lub I18n.

 43
Author: Luca Guidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-04 19:10:28

Widziałem kilka dużych witryn rails, które używają zarówno Memcached, jak i Redis. Memcached jest używany do efemerycznych rzeczy, które są miłe, aby utrzymać ciepło w pamięci, ale mogą być utracone / zregenerowane w razie potrzeby, i Redis do trwałego przechowywania. Oba są używane do odciążania głównego DB do odczytu/zapisu ciężkich operacji.

Więcej Szczegółów:

Memcached: używany do buforowania strony / fragmentu / odpowiedzi i jest ok, aby trafić limit pamięci na Memcached, ponieważ będzie LRU (ostatnio używany) do usuń stare rzeczy i często przechowuj dostępne klucze w pamięci. Ważne jest, aby cokolwiek w Memcached mogło być odtworzone z DB w razie potrzeby (nie jest to twoja jedyna kopia). Ale możesz wrzucać do niego rzeczy, a Memcached wykona, które są najczęściej używane i utrzyma je w pamięci. Nie musisz się martwić o usuwanie rzeczy z Memcached.

Redis: używasz tego do danych, których nie chcesz stracić i są wystarczająco małe, aby zmieścić się w pamięci. Zazwyczaj obejmuje to zadania resque/sidekiq, liczniki ograniczania szybkości, dzielenie wyników testów lub cokolwiek, czego nie chcesz stracić / odtworzyć. Nie chcesz przekraczać limitu pamięci, więc musisz być trochę bardziej ostrożny z tym, co przechowujesz i czyścisz później.

Redis zaczyna mieć problemy z wydajnością, gdy przekroczy limit pamięci (popraw mnie, jeśli się mylę). Można to rozwiązać, konfigurując Redis tak, aby działał jak Memcached i LRU expire stuff, więc nigdy osiąga limit pamięci. Ale nie chcesz tego robić ze wszystkim, co trzymasz w Redis, jak praca resque. Więc zamiast ludzi często zachować domyślne, Rails.pamięć podręczna ustawiona na Memcached(używając gem dalli). A następnie zachowują oddzielny $redis = ... zmienna globalna do wykonywania operacji redis.

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

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

Może być łatwy sposób, aby to wszystko zrobić w Redis-być może poprzez posiadanie dwóch oddzielnych instancji Redis, jednej z limitem twardej pamięci LRU, podobnym do Memcache, a drugiej dla trwałe przechowywanie? Nie widziałem tego używanego, ale zgaduję, że byłoby to wykonalne.

 18
Author: Brian Armstrong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-29 21:41:24

Rozważyłbym sprawdzenie mojej odpowiedzi w tym temacie:

Rails i buforowanie, czy łatwo jest przełączać się między memcache i redis?

Zasadniczo, z mojego doświadczenia, chciałbym opowiadać się za utrzymaniem ich osobno: memcached dla buforowania i redis dla struktur danych i bardziej trwałego przechowywania

 15
Author: efalcao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:34

Poprosiłem zespół z Redis Labs (którzy dostarczają Memcached Cloud oraz Chmura Redis add ons) o tym, który produkt poleciliby do buforowania Rails. Powiedzieli, że ogólnie zalecają Redis Cloud, że Memcached Cloud jest oferowany głównie do starszych celów, i zwrócili uwagę, że ich usługa Memcached Cloud jest w rzeczywistości zbudowana na bazie Redis Cloud.

 6
Author: Yarin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-15 16:09:43

Nie wiem Do czego ich używasz, ale w rzeczywistości używanie obu może dać ci przewagę wydajnościową: Memcached ma znacznie lepszą wydajność działającą na wielu rdzeniach niż Redis, więc buforowanie najważniejszych danych za pomocą Memcached i utrzymywanie reszty w Redis, korzystając z jego możliwości jako bazy danych, może zwiększyć wydajność.

 4
Author: slezica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-16 01:57:20