Redis und Memcache oder nur Redis?

85

Ich verwende memcached für das Caching in meiner Rails 3-App über die einfache Rails.cacheOberfläche und möchte jetzt einige Hintergrundjobverarbeitungen mit Redis und Resque durchführen.

Ich denke, sie sind unterschiedlich genug, um die Verwendung beider zu rechtfertigen. Auf Heroku fallen jedoch separate Gebühren für die Verwendung von Memcached und Redis an. Ist es sinnvoll, beide zu verwenden, oder sollte ich auf die Verwendung von Redis migrieren?

Ich verwende Memcached gerne zum Zwischenspeichern, da zuletzt verwendete Schlüssel automatisch aus dem Cache verschoben werden und ich die Cache-Daten nicht zum Fortbestehen benötige. Redis ist für mich größtenteils neu, aber ich verstehe, dass es standardmäßig persistent ist und dass Schlüssel nicht automatisch aus dem Cache verfallen.

EDIT: Ich wollte nur mit meiner Frage klarer werden. Ich weiß, dass es möglich ist, nur Redis anstelle von beiden zu verwenden. Ich denke, ich möchte nur wissen, ob dies bestimmte Nachteile mit sich bringt. Gibt es Gründe für die Implementierung und die Infrastruktur, warum ich Redis nicht einfach verwenden sollte? (Dh, wird für einfaches Caching schneller zwischengespeichert?) Ich habe in keiner Weise etwas Bestimmtes gefunden.

Markquezada
quelle
5
Für alle anderen, die dies in Betracht ziehen: Es gibt ein Redis-Store- Plugin für Rails, mit dem Sie Redis als Cache-Store verwenden können.
Markquezada

Antworten:

49

Angenommen, die Migration von memcached zu redis für das bereits durchgeführte Caching ist einfach genug, würde ich Redis nur verwenden, um die Dinge einfach zu halten.

In Redis ist die Persistenz optional, sodass Sie sie ähnlich wie memcached verwenden können, wenn Sie dies wünschen. Möglicherweise ist es sogar hilfreich, den Cache dauerhaft zu machen, um viele Cache-Fehler nach einem Neustart zu vermeiden. Der Ablauf ist ebenfalls verfügbar - der Algorithmus unterscheidet sich ein wenig vom zwischengespeicherten, reicht jedoch für die meisten Zwecke nicht aus - siehe http://redis.io/commands/expire für Details.

Tom Clarkson
quelle
1
Vielen Dank für die Antwort und die entsprechenden Dokumente. Ich habe meine Frage ein wenig bearbeitet, um klarer zu machen, wonach ich suche. Ich habe nicht über die Cache-Persistenz nach einem Neustart nachgedacht ... das ist eine nette Funktion. (Obwohl ich nicht sicher bin, wie nützlich es ist, wenn ich bedenke, dass ich Redis für Heroku verwenden würde.)
Markquezada
1
Wenn Sie einige Elemente kurzlebig (Fragment-Caching) und einige Elemente in Redis beibehalten möchten, müssen Sie zwei separate Redis-Instanzen erstellen?
Brian Armstrong
1
Während wir Redis sowohl für Jobwarteschlangen als auch für den Cache verwenden, führen wir sie mit unterschiedlichen Konfigurationen aus, insbesondere aus den Gründen, die @BrianArmstrong angibt. Der Cache ist kurzlebig, daher konfigurieren wir ihn so, dass er schnell ist, aber es ist in Ordnung, Dinge im Speicher zu verlieren und LRU zu löschen. Für die Warteschlange möchten wir wirklich keine Jobs verlieren, also konfigurieren wir sie mit Persistenz, damit sie wiederhergestellt werden kann.
Jwadsack
@jwadsack hast du einen Beitrag, in dem du zeigst, wie du diese Konfiguration implementiert hast?
Marklar
1
@ Marklar Gute Idee. Ich mache jetzt: ballardhack.wordpress.com/2015/09/30/…
jwadsack
44

Ich bin der Autor von redis-store . Es ist nicht erforderlich, Redis-Befehle direkt zu verwenden. Verwenden Sie einfach die folgende :expires_inOption:

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

Der Vorteil der Verwendung Redis ist Echtheit, und mit meinem Juwel, ist , dass Sie bereits Geschäfte haben für Rack::Cache, Rails.cacheoder I18n.

Luca Guidi
quelle
Danke für die Antwort Luca. Ich gehe davon aus, dass Sie Folgendes überschreiben können: expires_in direkt, wenn Sie etwas dauerhaft speichern müssen? Ich denke , die Frage ist wirklich über beide Memcached - Typ - Funktionalität und redis als persistenten Speicher nebeneinander verwenden.
Markquezada
3
Ich denke nicht, dass es sinnvoll ist, sowohl memcached als auch redis neben sich zu haben, da sie sich im selben NoSQL-Segment befinden: beide sind ak / v store. Redis PROS: 1. schneller als memcached 2. leistungsstärkere Befehle 3. kein Aufwärmen des Caches erforderlich 4. nützlich zum Lösen anderer Probleme (z. B. Warteschlangen mit Resque) KONS: 1. Sie benötigen einen externen Edelstein 2. nach einem Neustart den Server akzeptiert keine Befehle beim Lesen von Daten aus der angehängten Datei Memcached PROS: in Rails gebacken CONS: 1. langsamer als Redis 2. Cache Warmup.
Luca Guidi
3
@LucaGuidi Ich verwende derzeit RedisStore für meinen Rails-Cache. Ich kann nicht herausfinden, wie sowohl die Redis-URL als auch die Standard- URL festgelegt werden :expires_in. Kannst du helfen?
Chris Vincent
Wie ich, wenn Sie :expires_inProbleme bei der Einstellung mit redis_store haben, lesen Sie stackoverflow.com/questions/20907247/…
Anirudhan J
19

Ich habe einige große Rails-Sites gesehen, die sowohl Memcached als auch Redis verwenden. Memcached wird für kurzlebige Dinge verwendet, die sich gut im Speicher halten lassen, aber bei Bedarf verloren gehen / regeneriert werden können, und Redis für die dauerhafte Speicherung. Beide werden verwendet, um die Hauptdatenbank für das Lesen / Schreiben schwerer Operationen zu entlasten.

Mehr Details:

Memcached: Wird für das Zwischenspeichern von Seiten / Fragmenten / Antworten verwendet und es ist in Ordnung, das Speicherlimit für Memcached zu erreichen, da LRU (zuletzt verwendet) das alte Material abläuft und häufig aufgerufene Schlüssel im Speicher heiß hält. Es ist wichtig, dass alles in Memcached bei Bedarf aus der Datenbank neu erstellt werden kann (dies ist nicht Ihre einzige Kopie). Aber Sie können weiterhin Dinge hineinwerfen, und Memcached wird herausfinden, welche am häufigsten verwendet werden, und diese im Speicher behalten. Sie müssen sich keine Sorgen machen, Dinge aus Memcached zu entfernen.

redis: Sie verwenden dies für Daten, die Sie nicht verlieren möchten und die klein genug sind, um in den Speicher zu passen. Dies umfasst normalerweise Resque / Sidekiq-Jobs, Zähler für die Ratenbegrenzung, Split-Testergebnisse oder alles, was Sie nicht verlieren / neu erstellen möchten. Sie möchten das Speicherlimit hier nicht überschreiten, daher müssen Sie etwas vorsichtiger sein, was Sie später speichern und bereinigen.

Redis leidet unter Leistungsproblemen, sobald es sein Speicherlimit überschreitet (korrigieren Sie mich, wenn ich falsch liege). Es ist möglich, dieses Problem zu lösen, indem Sie Redis so konfigurieren, dass es sich wie Memcached verhält und LRU abläuft, sodass es nie sein Speicherlimit erreicht. Aber Sie möchten dies nicht mit allem tun, was Sie in Redis behalten, wie z. B. Resque-Jobs. Anstatt dass die Benutzer häufig die Standardeinstellung beibehalten, verwendet Rails.cache Memcached (unter Verwendung des dalliEdelsteins). Und dann behalten sie eine separate globale Variable $ redis = ... bei, um Redis-Operationen durchzuführen.

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

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

In Redis gibt es möglicherweise eine einfache Möglichkeit, dies alles zu tun - möglicherweise durch zwei separate Redis-Instanzen, eine mit einem LRU-Festplattenspeicher, ähnlich wie bei Memcache, und eine andere für dauerhaften Speicher? Ich habe das noch nicht benutzt gesehen, aber ich vermute, es wäre machbar.

Brian Armstrong
quelle
15

Ich würde in Betracht ziehen, meine Antwort zu diesem Thema zu überprüfen:

Rails und Caching, ist es einfach, zwischen Memcache und Redis zu wechseln?

Im Wesentlichen würde ich mich aufgrund meiner Erfahrung dafür einsetzen, sie getrennt zu halten: Memcached für Caching und Redis für Datenstrukturen und dauerhaftere Speicherung

efalcao
quelle
Obwohl ich ursprünglich vorhatte, sie auf der Grundlage der ursprünglichen Antwort auf meine Frage zu konsolidieren, bin ich seitdem im Grunde zu dem gleichen Schluss gekommen. Ich verwende Memcache für das grundlegende Caching und Redis für das Resque.
Markquezada
6

Ich habe das Team von Redis Labs (das die Add-Ons Memcached Cloud und Redis Cloud bereitstellt) gefragt, welches Produkt sie für das Rails-Caching empfehlen würden. Sie sagten, dass sie im Allgemeinen Redis Cloud empfehlen würden, dass Memcached Cloud hauptsächlich für Legacy-Zwecke angeboten wird, und wiesen darauf hin, dass ihr Memcached Cloud-Dienst tatsächlich auf Redis Cloud aufbaut.

Yarin
quelle
Also keine Notwendigkeit für Memcached und Redis, wie in Brians Antwort erwähnt? "Die Benutzer behalten häufig den Standard-Rails.cache bei, der für die Verwendung von memcached festgelegt ist (unter Verwendung des dalli-Edelsteins). Anschließend behalten sie eine separate globale Variable $ redis = ... bei, um Redis-Operationen auszuführen."
Marklar
4

Ich weiß nicht, wofür Sie sie verwenden, aber wenn Sie beide verwenden, können Sie einen Leistungsvorteil erzielen: Memcached bietet eine weitaus bessere Leistung auf mehreren Kernen als Redis, sodass die wichtigsten Daten mit Memcached zwischengespeichert werden und der Rest in Redis verbleibt Durch die Nutzung seiner Funktionen als Datenbank könnte die Leistung gesteigert werden.

Slezica
quelle
1
Das ist nicht ganz richtig - redis verwendet mehrere Instanzen anstelle mehrerer Threads. Daher ist der Vergleich einer Redis-Instanz mit einem Kern mit einer zwischengespeicherten Instanz mit mehreren Kernen kein besonders relevanter Test. Wenn Benchmarks verfügbar sind, die zeigen, dass beide Systeme am schnellsten sind, ist es außerdem unwahrscheinlich, dass der Unterschied in der realen Welt von Bedeutung ist.
Tom Clarkson
Der Multi-Prozess-Ansatz von Redis lässt sich auf Multi-Core-Systemen besser skalieren als der (Standard-) Ansatz von Memcached mit Multi-Threading: skalieren antirez.com/post/update-on-memcached-redis-benchmark.html
Ludger Sprenker
3
Dieses große Manko von Redis wird sehr oft heruntergespielt. Wenn Sie nach einer hohen Parallelität suchen und über viele Kerne verfügen, kann Memcached Redis umkreisen. Sharding ist keine gute Lösung, da Sie konsistentes Hashing in Ihrer Anwendung implementieren müssen und keine perfekte Verteilung zwischen Redis-Instanzen erhalten. Wenn beispielsweise Shard A die Konfiguration Ihrer Anwendung zwischenspeichert, die in jeder Anforderung verwendet wird, erhält Shard A mehr Anforderungen als die anderen Shards, die nicht bei jeder Anforderung getroffen werden.
ColinM