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 dalli
Edelsteins). 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.