Używam memcached do buforowania w mojej aplikacji Rails 3 za pośrednictwem prostego Rails.cache
interfejsu, a teraz chciałbym wykonać pewne przetwarzanie zadań w tle za pomocą redis i resque.
Myślę, że są na tyle różne, że uzasadniają używanie obu. Jednak na heroku obowiązują oddzielne opłaty za używanie memcached i redis. Czy ma sens używanie obu, czy też powinienem przejść na używanie tylko redis?
Lubię używać memcached do buforowania, ponieważ ostatnio używane klucze są automatycznie wypychane z pamięci podręcznej i nie potrzebuję danych pamięci podręcznej, aby zachować. 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.
EDYCJA: Po prostu chciałem wyjaśnić moje pytanie. Wiem, że można używać tylko Redis zamiast obu. Chyba po prostu chcę wiedzieć, czy ma to jakieś szczególne wady? Biorąc pod uwagę zarówno implementację, jak i infrastrukturę, czy są jakieś powody, dla których nie powinienem po prostu używać Redis? (To znaczy, czy memcached jest szybszy dla prostego buforowania?) Nie znalazłem nic ostatecznego.
źródło
Odpowiedzi:
Zakładając, że migracja z memcached do redis w celu buforowania, które już wykonałeś, jest dość ł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 się nawet okazać, że utrwalenie pamięci podręcznej jest przydatne, aby uniknąć wielu błędów pamięci podręcznej po ponownym uruchomieniu. Dostępne jest również wygasanie - algorytm nieco różni się od memcached, ale nie jest na tyle istotny, aby mieć znaczenie dla większości celów - szczegóły można znaleźć na stronie http://redis.io/commands/expire .
źródło
Jestem autorem redis-store , nie ma potrzeby bezpośredniego używania poleceń Redis, wystarczy skorzystać z takiej
:expires_in
opcji:ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
Zaletą korzystania z Redis jest trwałość, a także z mojego gem, jest to, że masz już do sklepów
Rack::Cache
,Rails.cache
lubI18n
.źródło
:expires_in
. Możesz pomóc?:expires_in
przy użyciu redis_store, odnieś się do stackoverflow.com/questions/20907247/ ...Widziałem kilka dużych witryn railsowych, które używają zarówno Memcached, jak i Redis. Memcached służy do efemerycznych rzeczy, które są przyjemne do przechowywania w pamięci, ale można je utracić / zregenerować w razie potrzeby, a Redis do trwałego przechowywania. Oba są używane do odciążenia głównej bazy danych do odczytu / zapisu ciężkich operacji.
Więcej szczegółów:
Memcached: używany do buforowania stron / fragmentów / odpowiedzi i można przekroczyć limit pamięci w Memcached, ponieważ LRU (ostatnio używany) wygaśnie stare rzeczy i często utrzyma dostępne klucze w pamięci. Ważne jest, aby w razie potrzeby wszystko w Memcached mogło zostać odtworzone z bazy danych (nie jest to jedyna kopia). Ale możesz dalej wrzucać do niego rzeczy, a Memcached domyśli się, które są najczęściej używane, i zachowa je w pamięci. Nie musisz się martwić usuwaniem rzeczy z Memcached.
redis: używasz tego do danych, których nie chciałbyś stracić i są wystarczająco małe, aby zmieścić się w pamięci. Zwykle obejmuje to zadania resque / sidekiq, liczniki ograniczenia szybkości, podzielone wyniki testów lub cokolwiek, czego nie chciałbyś stracić / odtworzyć. Nie chcesz tutaj przekraczać limitu pamięci, więc musisz trochę bardziej uważać na to, co przechowujesz i czyścisz później.
Redis zaczyna mieć problemy z wydajnością po przekroczeniu limitu pamięci (popraw mnie, jeśli się mylę). Można to rozwiązać, konfigurując Redis tak, aby działał jak elementy Memcached i LRU, dzięki czemu nigdy nie osiągnie limitu pamięci. Ale nie chciałbyś tego robić ze wszystkim, co przechowujesz w Redis, na przykład ze wznowieniem pracy. Więc zamiast ludzie często zachowują wartość domyślną, Rails.cache ustawia używanie Memcached (używając
dalli
klejnotu). Następnie trzymają oddzielną zmienną globalną $ redis = ... 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 istnieć łatwy sposób na zrobienie tego wszystkiego w Redis - być może przez dwie oddzielne instancje Redis, jedną z twardym limitem pamięci LRU, podobną do Memcache, a drugą do trwałego przechowywania? Nie widziałem tego używanego, ale myślę, że byłoby to wykonalne.
źródło
Rozważyłbym sprawdzenie mojej odpowiedzi na ten temat:
Railsy i buforowanie - czy łatwo jest przełączać się między memcache i redis?
Zasadniczo, z mojego doświadczenia, zalecałbym zachowanie ich oddzielnie: memcached do buforowania i redis dla struktur danych i bardziej trwałego przechowywania
źródło
Zapytałem zespół w Redis Labs (który dostarcza dodatki Memcached Cloud i Redis Cloud ) o to, który produkt poleciliby do buforowania Railsów. Powiedzieli, że ogólnie poleciliby Redis Cloud, że Memcached Cloud jest oferowany głównie do celów starszych, i wskazali, że ich usługa Memcached Cloud jest w rzeczywistości oparta na Redis Cloud.
źródło
Nie wiem, do czego ich używasz, ale w rzeczywistości używanie obu może dać ci przewagę wydajności: Memcached ma znacznie lepszą wydajność działającą na wielu rdzeniach niż Redis, więc buforowanie najważniejszych danych w Memcached i zatrzymywanie reszty w Redis , wykorzystując jego możliwości jako bazy danych, może zwiększyć wydajność.
źródło