Redis e Memcache o solo Redis?


85

Sto usando memcached per un po 'di cache nella mia app Rails 3 attraverso la semplice Rails.cacheinterfaccia e ora mi piacerebbe fare un po' di elaborazione in background con redis e resque.

Penso che siano abbastanza diversi da giustificare l'utilizzo di entrambi. Su heroku, tuttavia, ci sono tariffe separate per utilizzare memcached e redis. Ha senso utilizzarli entrambi o devo migrare utilizzando solo redis?

Mi piace usare memcached per la memorizzazione nella cache perché le chiavi utilizzate meno di recente vengono automaticamente eliminate dalla cache e non ho bisogno dei dati della cache per persistere. Redis è per lo più nuovo per me, ma capisco che è persistente per impostazione predefinita e che le chiavi non scadono automaticamente dalla cache.

EDIT: Volevo solo essere più chiaro con la mia domanda. So che è possibile utilizzare solo Redis invece di entrambi. Immagino di voler solo sapere se ci sono degli svantaggi specifici nel farlo? Considerando sia l'implementazione che l'infrastruttura, ci sono ragioni per cui non dovrei usare Redis? (Cioè, memcached è più veloce per un semplice caching?) Non ho trovato nulla di definitivo in entrambi i casi.


5
Per chiunque altro lo consideri: c'è un plug-in redis-store per rails che ti consente di utilizzare redis come cache store.
markquezada

Risposte:


49

Supponendo che la migrazione da memcached a redis per il caching che già fai sia abbastanza facile, andrei con redis solo per mantenere le cose semplici.

In redis la persistenza è opzionale, quindi puoi usarla in modo molto simile a memcached se è quello che vuoi. Potresti anche scoprire che rendere la cache persistente è utile per evitare molti errori di cache dopo un riavvio. È disponibile anche la scadenza - l'algoritmo è un po 'diverso da memcached, ma non abbastanza da essere importante per la maggior parte degli scopi - vedere http://redis.io/commands/expire per i dettagli.


1
Grazie per la risposta e i documenti pertinenti. Ho modificato un po 'la mia domanda per rendere più chiaro ciò che sto cercando. Non ho pensato alla persistenza della cache dopo un riavvio ... questa è una bella caratteristica. (Anche se non sono sicuro di quanto sia utile considerando che userei Redis per andare con heroku.)
markquezada

1
Se si desidera mantenere alcuni elementi temporanei (cache dei frammenti) e alcuni elementi persistenti in redis, è necessario creare due istanze redis separate?
Brian Armstrong

1
Sebbene utilizziamo Redis sia per le code dei lavori che per la cache, li eseguiamo con configurazioni diverse per i motivi specificati da @BrianArmstrong. La cache è effimera, quindi la configuriamo in modo che sia veloce, ma va bene perdere cose in memoria e rilasciare LRU. Per la coda, non vogliamo davvero perdere i lavori, quindi la configuriamo con la persistenza in modo che sia recuperabile.
jwadsack

@jwadsack hai un post in cui mostri come hai implementato questa configurazione?
Marklar

1
@Marklar Buona idea. Lo faccio ora: ballardhack.wordpress.com/2015/09/30/…
jwadsack

44

Sono l'autore di redis-store , non è necessario utilizzare direttamente i comandi Redis, basta utilizzare l' :expires_inopzione come questa:

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

Il vantaggio di usare Redis è la solidità e, con la mia gemma, è che hai già negozi per Rack::Cache, Rails.cacheo I18n.


Grazie per la risposta Luca. Suppongo che tu possa sovrascrivere: expires_in direttamente quando devi memorizzare qualcosa in modo persistente? Immagino che la domanda riguardi davvero l'utilizzo di entrambe le funzionalità di tipo memcached e l' utilizzo di redis come archivio persistente l'uno accanto all'altro.
markquezada

3
Non penso abbia senso avere sia memcached che redis insieme, dal momento che sono nello stesso segmento NoSQL: entrambi sono un negozio ak / v. Redis PRO: 1. più veloce di memcached 2. comandi più potenti 3. nessun riscaldamento della cache necessario 4. utile per risolvere altri problemi (es. Code con Resque) CONTRO: 1. serve una gemma esterna 2. dopo un riavvio, il server non accetta comandi durante la lettura dei dati dal file di aggiunta Memcached PRO: cotto in Rails CONTRO: 1. più lento di Redis 2. riscaldamento della cache.
Luca Guidi

3
@LucaGuidi Attualmente sto usando RedisStore per la mia cache di Rails. Non riesco a capire come impostare sia l'URL Redis che il valore predefinito :expires_in. Puoi aiutare?
Chris Vincent

Come me, Se siete di fronte impostazione problema :expires_inutilizzando redis_store riferimento stackoverflow.com/questions/20907247/...
Anirudhan J

19

Ho visto alcuni grandi siti di rails che utilizzano sia Memcached che Redis. Memcached viene utilizzato per cose effimere che sono piacevoli da mantenere in memoria ma possono essere perse / rigenerate se necessario e Redis per l'archiviazione persistente. Entrambi sono usati per togliere un carico dal DB principale per operazioni pesanti di lettura / scrittura.

Più dettagli:

Memcached: usato per il caching di pagine / frammenti / risposte e va bene raggiungere il limite di memoria su Memcached perché LRU (usato meno di recente) farà scadere le vecchie cose e manterrà frequentemente le chiavi a cui si accede in memoria. È importante che qualsiasi cosa in Memcached possa essere ricreata dal DB se necessario (non è la tua unica copia). Ma puoi continuare a scaricare le cose al suo interno e Memcached calcolerà quali sono usate più frequentemente e le manterrà calde nella memoria. Non devi preoccuparti di rimuovere cose da Memcached.

redis: lo usi per i dati che non vorresti perdere ed è abbastanza piccolo da stare in memoria. Questo di solito include lavori resque / sidekiq, contatori per la limitazione della velocità, risultati di split test o qualsiasi cosa che non vorresti perdere / ricreare. Non vuoi superare il limite di memoria qui, quindi devi stare un po 'più attento a ciò che memorizzi e ripulisci in seguito.

Redis inizia a soffrire di problemi di prestazioni una volta che supera il limite di memoria (correggimi se sbaglio). È possibile risolvere questo problema configurando Redis in modo che si comporti come Memcached e LRU scadono, quindi non raggiunge mai il limite di memoria. Ma non vorresti farlo con tutto ciò che conservi in ​​Redis, come i lavori di resque. Quindi, invece delle persone spesso mantengono il valore predefinito, Rails.cache impostato per utilizzare Memcached (usando la dalligemma). E poi mantengono una variabile globale $ redis = ... separata per eseguire le operazioni redis.

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

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

Potrebbe esserci un modo semplice per fare tutto questo in Redis, magari avendo due istanze Redis separate, una con un limite di memoria rigida LRU, simile a Memcache, e un'altra per l'archiviazione persistente? Non l'ho visto usato, ma immagino che sarebbe fattibile.


15

Considererei di controllare la mia risposta su questo argomento:

Rails e caching, è facile passare da memcache a redis?

In sostanza, in base alla mia esperienza, suggerirei di tenerli separati: memcached per il caching e redis per le strutture dei dati e uno storage più persistente


Sebbene inizialmente avessi pianificato di consolidarli sulla base della risposta originale alla mia domanda, da allora sono giunto sostanzialmente alla stessa conclusione. Sto usando memcache per la memorizzazione nella cache di base e redis per resque.
markquezada

6

Ho chiesto al team di Redis Labs (che fornisce i componenti aggiuntivi Memcached Cloud e Redis Cloud ) quale prodotto avrebbero consigliato per il caching di Rails. Hanno affermato che in generale raccomanderebbero Redis Cloud, che Memcached Cloud è offerto principalmente per scopi legacy e hanno sottolineato che il loro servizio Memcached Cloud è in realtà costruito su Redis Cloud.


Quindi non c'è bisogno sia di memcached che di redis come menzionato nella risposta di Brian? "le persone spesso mantengono il Rails.cache predefinito impostato per usare memcached (usando la gemma dalli). E poi mantengono una variabile globale $ redis = ... separata per eseguire le operazioni redis."
Marklar

4

Non so per cosa li stai usando, ma in realtà l'utilizzo di entrambi potrebbe darti un vantaggio in termini di prestazioni: Memcached ha prestazioni di gran lunga migliori in esecuzione su più core rispetto a Redis, quindi memorizza nella cache i dati più importanti con Memcached e mantiene il resto in Redis , sfruttando le sue capacità di database, potrebbe aumentare le prestazioni.


1
Non è del tutto vero: redis utilizza più istanze anziché più thread, quindi il confronto di un'istanza redis single core con un'istanza memcached multi core non è un test particolarmente rilevante. Inoltre, quando sono disponibili benchmark che dimostrano che entrambi i sistemi sono i più veloci, è improbabile che la differenza abbia importanza nel mondo reale.
Tom Clarkson

L'approccio multi processo di redis scala meglio su sistemi multi core rispetto all'approccio (predefinito) di memcached con multi-threading: antirez.com/post/update-on-memcached-redis-benchmark.html
Ludger Sprenker

3
Questo grave difetto di Redis è davvero molto minimizzato. Se stai cercando un'elevata concorrenza e hai molti core, Memcached può eseguire cerchi attorno a Redis. Lo sharding non è una buona soluzione poiché devi implementare l'hashing coerente nella tua applicazione e non otterrai una distribuzione perfetta tra le istanze Redis. Ad esempio, se lo shard A memorizza nella cache la configurazione dell'applicazione utilizzata in ogni richiesta, lo shard A riceverà più richieste rispetto agli altri frammenti che non vengono raggiunti per ogni richiesta.
ColinM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.