Memcached vs. Redis?


1467

Stiamo usando un'app Web Ruby con il server Redis per la memorizzazione nella cache. C'è un punto per testare Memcached invece?

Cosa ci darà prestazioni migliori? Qualche vantaggio o svantaggio tra Redis e Memcached?

Punti da considerare:

  • Velocità di lettura / scrittura.
  • Utilizzo della memoria.
  • Dump I / O del disco.
  • Scaling.

38
Un'altra analisi oltre ai seguenti commenti: Google Trends: redis vs. memcached
MarkHu

3
Un commento che non merita una risposta: se stai cercando servizi basati su cloud per questi due sistemi (ad esempio i componenti aggiuntivi di heroku) I servizi memcached a volte sono un po 'più economici per MB per qualsiasi motivo.
Ben Roberts,

Risposte:


2106

Riepilogo (TL; DR)

Aggiornato il 3 giugno 2017

Redis è più potente, più popolare e meglio supportato rispetto a memcached. Memcached può fare solo una piccola parte delle cose che Redis può fare. Redis è migliore anche quando le loro caratteristiche si sovrappongono.

Per qualsiasi novità, usa Redis.

Memcached vs Redis: confronto diretto

Entrambi gli strumenti sono archivi di dati potenti, veloci e in memoria utili come cache. Entrambi possono aiutare ad accelerare l'applicazione memorizzando nella cache i risultati del database, i frammenti HTML o qualsiasi altra cosa che potrebbe essere costosa da generare.

Punti da considerare

Se utilizzati per la stessa cosa, ecco come si confrontano utilizzando "Punti da considerare" della domanda originale:

  • Velocità di lettura / scrittura : entrambe sono estremamente veloci. I benchmark variano in base al carico di lavoro, alle versioni e a molti altri fattori, ma generalmente mostrano che i redis sono veloci o quasi veloci come memcached. Consiglio redis, ma non perché memcached è lento. Non è.
  • Utilizzo della memoria : Redis è migliore.
    • memcached: specifichi la dimensione della cache e mentre inserisci gli elementi il ​​demone cresce rapidamente a poco più di questa dimensione. Non c'è mai davvero modo di recuperare nulla di quello spazio, a meno di riavviare memcached. Tutte le tue chiavi potrebbero essere scadute, potresti svuotare il database e userebbe comunque l'intero pezzo di RAM con cui lo hai configurato.
    • redis: L'impostazione di una dimensione massima dipende da te. Redis non userà mai più di quanto deve e ti restituirà la memoria che non utilizza più.
    • Ho archiviato 100.000 ~ 2 KB di stringhe (~ 200 MB) di frasi casuali in entrambi. L'utilizzo della memoria RAM memorizzata è cresciuto a ~ 225 MB. L'utilizzo della RAM Redis è cresciuto a ~ 228 MB. Dopo aver scaricato entrambi, il redis è sceso a ~ 29 MB e memcached è rimasto a ~ 225 MB. Allo stesso modo sono efficienti nel modo in cui archiviano i dati, ma solo uno è in grado di recuperarli.
  • Dump I / O del disco : una chiara vittoria per il redis poiché lo fa per impostazione predefinita e ha una persistenza molto configurabile. Memcached non ha meccanismi per il dumping su disco senza strumenti di terze parti.
  • Ridimensionamento : entrambi ti offrono un sacco di headroom prima di aver bisogno di più di una singola istanza come cache. Redis include strumenti per aiutarti ad andare oltre ciò mentre memcached no.

memcached

Memcached è un semplice server cache volatile. Consente di memorizzare coppie chiave / valore in cui il valore è limitato a una stringa fino a 1 MB.

È bravo in questo, ma è tutto. Puoi accedere a questi valori con la loro chiave a velocità estremamente elevata, spesso saturando la rete disponibile o persino la larghezza di banda della memoria.

Quando riavvii memcached, i tuoi dati spariranno. Questo va bene per una cache. Non dovresti conservare nulla di importante lì.

Se hai bisogno di prestazioni elevate o disponibilità elevata, sono disponibili strumenti, prodotti e servizi di terze parti.

Redis

Redis può fare gli stessi lavori di memcached e può farli meglio.

Redis può anche fungere da cache . Può anche memorizzare coppie chiave / valore. In redis possono anche arrivare a 512 MB.

Puoi disattivare la persistenza e perderà felicemente anche i tuoi dati al riavvio. Se vuoi che la tua cache sopravviva al riavvio, ti consente anche di farlo. In effetti, questo è il valore predefinito.

È anche super veloce, spesso limitato dalla larghezza di banda della rete o della memoria.

Se un'istanza di redis / memcached non è abbastanza per il tuo carico di lavoro, redis è la scelta chiara. Redis include il supporto cluster e viene fornito con strumenti ad alta disponibilità ( redis-sentinel ) direttamente "nella confezione". Negli ultimi anni il redis è anche emerso come il chiaro leader degli utensili di terze parti. Aziende come Redis Labs, Amazon e altri offrono molti utili strumenti e servizi redis. L'ecosistema attorno a Redis è molto più grande. Il numero di distribuzioni su larga scala è ora probabilmente maggiore rispetto a quello memcached.

Il Redis Superset

Redis è più di una cache. È un server di struttura dati in memoria. Di seguito troverai una rapida panoramica delle cose che Redis può fare oltre ad essere una semplice cache chiave / valore come memcached. La maggior parte delle funzionalità di Redis sono cose che Memcached non può fare.

Documentazione

Redis è meglio documentato rispetto a memcached. Mentre questo può essere soggettivo, sembra essere sempre più vero per tutto il tempo.

redis.io è una fantastica risorsa facilmente navigabile. Ti consente di provare redis nel browser e ti dà persino esempi interattivi in ​​tempo reale con ogni comando nei documenti.

Ora ci sono 2 volte più risultati dello stackoverflow per redis come memcached. 2x il numero di risultati di Google. Esempi più facilmente accessibili in più lingue. Sviluppo più attivo. Sviluppo client più attivo. Queste misurazioni potrebbero non significare molto individualmente, ma in combinazione dipingono un quadro chiaro che il supporto e la documentazione per il redis sono maggiori e molto più aggiornati.

Persistenza

Per impostazione predefinita, redis persiste i dati su disco utilizzando un meccanismo chiamato snapshot. Se hai abbastanza RAM disponibile è in grado di scrivere tutti i tuoi dati su disco senza quasi nessun peggioramento delle prestazioni. È quasi gratis!

Nella modalità snapshot c'è la possibilità che un arresto improvviso possa provocare una piccola quantità di dati persi. Se devi assolutamente assicurarti che nessun dato venga mai perso, non ti preoccupare, anche redis ha le spalle lì con la modalità AOF (Aggiungi solo file). In questa modalità di persistenza i dati possono essere sincronizzati su disco mentre vengono scritti. Ciò può ridurre la velocità di scrittura massima a una velocità di scrittura del disco elevata, ma dovrebbe comunque essere abbastanza veloce.

Esistono molte opzioni di configurazione per ottimizzare la persistenza, se necessario, ma le impostazioni predefinite sono molto ragionevoli. Queste opzioni semplificano l'impostazione di redis come luogo sicuro e ridondante per l'archiviazione dei dati. È un vero database.

Molti tipi di dati

Memcached è limitato alle stringhe, ma Redis è un server di strutture dati che può servire molti tipi di dati diversi. Fornisce inoltre i comandi necessari per sfruttare al meglio questi tipi di dati.

Stringhe ( comandi )

Valori semplici di testo o binari che possono avere dimensioni massime di 512 MB. Questo è l'unico tipo di dati redis e condivisione memcached, sebbene le stringhe memcached siano limitate a 1 MB.

Redis offre ulteriori strumenti per sfruttare questo tipo di dati offrendo comandi per operazioni bit a bit, manipolazione a livello di bit, supporto per incremento / decremento in virgola mobile, query di intervallo e operazioni multi-chiave. Memcached non supporta nulla di tutto ciò.

Le stringhe sono utili per tutti i tipi di casi d'uso, motivo per cui memcached è abbastanza utile solo con questo tipo di dati.

Hash ( comandi )

Gli hash sono una specie di archivio valori chiave all'interno di un archivio valori chiave. Si mappano tra campi stringa e valori stringa. Le mappe di valori di campo> utilizzando un hash sono leggermente più efficienti in termini di spazio rispetto alle mappe di valori di chiave> che utilizzano stringhe regolari.

Gli hash sono utili come spazio dei nomi o quando si desidera raggruppare logicamente molte chiavi. Con un hash puoi prendere tutti i membri in modo efficiente, far scadere tutti i membri insieme, eliminare tutti i membri insieme, ecc. Ottimo per qualsiasi caso d'uso in cui hai diverse coppie chiave / valore che devono essere raggruppate.

Un esempio di utilizzo di un hash è la memorizzazione dei profili utente tra le applicazioni. Un hash redis memorizzato con l'ID utente come chiave consentirà di archiviare tutti i bit di dati relativi a un utente in base alle esigenze mantenendoli archiviati in un'unica chiave. Il vantaggio di utilizzare un hash invece di serializzare il profilo in una stringa è che puoi avere diverse applicazioni che leggono / scrivono campi diversi all'interno del profilo utente senza doversi preoccupare di un'app che ignora le modifiche apportate da altri (cosa che può accadere se si serializza non aggiornato dati).

Elenchi ( comandi )

Le liste Redis sono raccolte ordinate di stringhe. Sono ottimizzati per l'inserimento, la lettura o la rimozione di valori dalla parte superiore o inferiore (ovvero: sinistra o destra) dell'elenco.

Redis fornisce molti comandi per sfruttare gli elenchi, inclusi i comandi per spingere / pop gli elementi, spingere / pop tra gli elenchi, troncare gli elenchi, eseguire query su intervalli, ecc.

Gli elenchi sono perfetti, atomici e di lunga durata. Funzionano perfettamente con code di lavoro, registri, buffer e molti altri casi d'uso.

Set ( comandi )

Gli insiemi sono raccolte non ordinate di valori univoci. Sono ottimizzati per consentire di verificare rapidamente se un valore è presente nel set, aggiungere / rimuovere rapidamente valori e misurare la sovrapposizione con altri set.

Questi sono ottimi per cose come elenchi di controllo accessi, tracker visitatori unici e molte altre cose. La maggior parte dei linguaggi di programmazione ha qualcosa di simile (di solito chiamato Set). È così, distribuito solo.

Redis fornisce diversi comandi per gestire i set. Sono presenti quelli ovvi come l'aggiunta, la rimozione e il controllo del set. Quindi sono comandi meno ovvi come fare scoppiare / leggere un oggetto casuale e comandi per eseguire unioni e intersezioni con altri insiemi.

Set ordinati ( comandi )

I set ordinati sono anche raccolte di valori univoci. Questi, come suggerisce il nome, sono ordinati. Sono ordinati per punteggio, quindi lessicograficamente.

Questo tipo di dati è ottimizzato per ricerche rapide per punteggio. Ottenere il massimo, il più basso o qualsiasi intervallo di valori tra è estremamente veloce.

Se aggiungi utenti a un set ordinato insieme al loro punteggio più alto, hai una classifica perfetta. Man mano che arrivano nuovi punteggi alti, aggiungili nuovamente al set con il loro punteggio più alto e riordinerà la tua classifica. Ottimo anche per tenere traccia dell'ultima volta che gli utenti hanno visitato e chi è attivo nella tua applicazione.

Se si memorizzano valori con lo stesso punteggio, è possibile ordinarli lessicograficamente (pensare in ordine alfabetico). Questo può essere utile per cose come le funzionalità di completamento automatico.

Molti comandi dei set ordinati sono simili ai comandi per i set, a volte con un parametro punteggio aggiuntivo. Sono inclusi anche i comandi per la gestione dei punteggi e l'interrogazione per punteggio.

Geo

Redis ha diversi comandi per l'archiviazione, il recupero e la misurazione dei dati geografici. Ciò include le interrogazioni sul raggio e la misurazione delle distanze tra i punti.

I dati tecnicamente geografici in redis sono archiviati in insiemi ordinati, quindi questo non è un tipo di dati veramente separato. È più un'estensione in cima ai set ordinati.

Bitmap e HyperLogLog

Come geo, questi non sono tipi di dati completamente separati. Questi sono comandi che ti consentono di trattare i dati delle stringhe come se fossero bitmap o hyperloglog.

Le bitmap sono le finalità degli operatori a livello di bit a cui ho fatto riferimento Strings. Questo tipo di dati è stato l'elemento base del recente progetto di collaborazione artistica di reddit: r / Place .

HyperLogLog consente di utilizzare una quantità di spazio estremamente ridotta costante per contare valori univoci quasi illimitati con una precisione scioccante. Usando solo ~ 16 KB puoi contare in modo efficiente il numero di visitatori unici sul tuo sito, anche se quel numero è in milioni.

Transazioni e atomicità

I comandi in redis sono atomici, il che significa che puoi essere sicuro che non appena scrivi un valore su redis quel valore è visibile a tutti i client collegati a redis. Non c'è attesa per la propagazione di quel valore. Anche tecnicamente memcached è atomico, ma con la redis aggiunta di tutte queste funzionalità oltre a memcached vale la pena notare e in qualche modo impressionante che tutti questi tipi di dati e funzionalità aggiuntivi siano anche atomici.

Pur non essendo la stessa cosa delle transazioni nei database relazionali, redis ha anche transazioni che usano il "blocco ottimistico" ( WATCH / MULTI / EXEC ).

pipelining

Redis fornisce una funzione chiamata " pipelining ". Se hai molti comandi redis che vuoi eseguire puoi usare il pipelining per inviarli a redis all-in-once invece che uno alla volta.

Normalmente quando si esegue un comando su redis o memcached, ogni comando è un ciclo di richiesta / risposta separato. Con il pipelining, redis può bufferizzare diversi comandi ed eseguirli tutti in una volta, rispondendo con tutte le risposte a tutti i tuoi comandi in un'unica risposta.

Ciò può consentire di ottenere un throughput ancora maggiore sull'importazione in blocco o altre azioni che comportano molti comandi.

Pub / Sub

Redis ha comandi dedicati alla funzionalità pub / sub , che consente a redis di agire come emittente di messaggi ad alta velocità. Ciò consente a un singolo client di pubblicare messaggi su molti altri client collegati a un canale.

Redis fa pub / sub e quasi tutti gli strumenti. Redattori di messaggi dedicati come RabbitMQ possono avere vantaggi in alcune aree, ma il fatto che lo stesso server possa anche darti code permanenti e permanenti e altre strutture di dati di cui i tuoi carichi di lavoro pub / sub probabilmente necessitano, Redis si dimostrerà spesso lo strumento migliore e più semplice per il lavoro.

Lua Scripting

È possibile pensare a script lua come l'SQL di redis o le procedure memorizzate. È sia più che meno, ma l'analogia funziona principalmente.

Forse hai calcoli complessi che vuoi eseguire con redis. Forse non puoi permetterti di ripristinare le tue transazioni e hai bisogno di garanzie che ogni fase di un processo complesso avvenga atomicamente. Questi problemi e molti altri possono essere risolti con gli script lua.

L'intero script viene eseguito atomicamente, quindi se puoi adattare la tua logica a uno script lua puoi spesso evitare di fare confusione con transazioni di blocco ottimistiche.

scalata

Come accennato in precedenza, redis include il supporto integrato per il clustering ed è in bundle con il proprio strumento ad alta disponibilità chiamato redis-sentinel.

Conclusione

Senza esitazione, consiglierei redis over memcached per eventuali nuovi progetti o progetti esistenti che non utilizzano già memcached.

Quanto sopra può sembrare che non mi piaccia memcached. Al contrario: è uno strumento potente, semplice, stabile, maturo e indurito. Ci sono anche alcuni casi d'uso in cui è un po 'più veloce di redis. Adoro memcached. Non penso che abbia molto senso per lo sviluppo futuro.

Redis fa tutto ciò che è memorizzato nella cache, spesso meglio. Qualsiasi vantaggio prestazionale per memcached è minore e specifico del carico di lavoro. Esistono anche carichi di lavoro per i quali i redis saranno più veloci e molti altri carichi di lavoro che i redis possono fare, mentre i memcached semplicemente non possono farlo. Le minuscole differenze di prestazioni sembrano minori di fronte al gigantesco divario di funzionalità e il fatto che entrambi gli strumenti sono così veloci ed efficienti che potrebbe benissimo essere l'ultimo pezzo della tua infrastruttura di cui dovrai mai preoccuparti per il ridimensionamento.

C'è solo uno scenario in cui memcached ha più senso: dove memcached è già in uso come cache. Se stai già memorizzando nella cache con memcached, continua a usarlo, se soddisfa le tue esigenze. Probabilmente non vale la pena passare a redis e se si intende utilizzare redis solo per la memorizzazione nella cache, potrebbe non offrire abbastanza benefici per valere il proprio tempo. Se memcached non soddisfa le tue esigenze, probabilmente dovresti passare a redis. Questo è vero se è necessario scalare oltre memcached o se sono necessarie funzionalità aggiuntive.


11
In che modo Memcached offre il clustering in un modo esistente nel server stesso? Ho sempre usato librerie distribuite su un pool di server memcached usando algoritmi di hashing o un modulo. Lo stesso si dice per Redis. Uso principalmente Python e sembra che ci siano alcuni moduli che non si basano sulla libreria memcached per gestire i pool di connessione.
Whardier,

2
"Transazioni con blocco ottimistico (WATCH / MULTI / EXEC)" - Redis non ha transazioni giuste. Vale a dire se [multi, cmd1, cmd2, cmd3 (eccezione), exec] verranno eseguiti cmd1 e cmd2.
ZedZip,

10
@Oleg che in realtà non è vero. Se si utilizza multi-exec, i comandi vengono bufferizzati (ovvero: non eseguiti) fino a quando non viene eseguita la exec, quindi se si ha un'eccezione prima della exec, allora nessun comando viene effettivamente eseguito. Se viene chiamato exec, tutti i comandi bufferizzati vengono eseguiti atomicamente, a meno che, naturalmente, una variabile watch sia stata modificata dalla prima chiamata di multi. Quest'ultimo meccanismo è la parte di blocco ottimista.
Carl Zulauf,

3
@whardier Hai ragione. Risposta aggiornata per riflettere che il "supporto" del cluster memcached è abilitato da strumenti aggiuntivi. Avrei dovuto ricercarlo meglio.
Carl Zulauf,

3
che ne pensi del clustering con il server couchbase? (memcached compatibile)
Ken Liu

142

Usa Redis se

  1. È necessario eliminare / scadere selettivamente gli elementi nella cache. (Hai bisogno di questo)

  2. È richiesta la possibilità di interrogare chiavi di un determinato tipo. eq. 'blog1: posts: *', 'blog2: categorie: xyz: posts: *'. o si! questo è molto importante. Utilizzare questo per invalidare selettivamente determinati tipi di elementi memorizzati nella cache. Puoi anche usarlo per invalidare la cache dei frammenti, la cache della pagina, solo gli oggetti AR di un determinato tipo, ecc.

  3. Persistenza (ne avrai bisogno, a meno che tu non stia bene con la cache che deve riscaldarsi dopo ogni riavvio. Molto essenziale per gli oggetti che cambiano di rado)

Usa memcached se

  1. Memcached ti dà mal di testa!
  2. umm ... clustering? meh. se vai così lontano, usa Varnish e Redis per memorizzare nella cache frammenti e oggetti AR.

Dalla mia esperienza ho avuto una stabilità molto migliore con Redis rispetto a Memcached


7
La documentazione di Redis afferma che l'utilizzo dei pattern richiede una scansione della tabella. blog1: posts: * potrebbe richiedere una scansione della tabella O (N). Ovviamente, è ancora veloce su set di dati di dimensioni ragionevoli, dal momento che Redis è veloce. Dovrebbe essere OK per il test o l'amministratore.
malinconico

182
Headached è uno scherzo, giusto? :-) Ho cercato su Google per memcached ma non ho trovato nulla di ragionevole. (Sono nuovo di Memcached e Redis)
KajMagnus,

11
votato giù per la stessa ragione che @pellucide. Redis potrebbe essere migliore di Memcached, ma Memcached è banale da usare. Non ho mai avuto problemi con esso ed è banale da configurare.
Diego Jancic,

5
Grazie @KajMagnus per aver reso la mia giornata .. forse la mia intera settimana 😂
alex

@DiegoJancic Redis è una delle tecnologie più semplici da utilizzare. Senza una conoscenza precedente di Redis mi ci sono voluti solo 20 minuti per installarlo su Ubuntu usando un gestore di pacchetti nel cloud e iniziare a fare semplici query. 4 ore dopo ho potuto creare scenari più complessi con inserimenti batch usando lo script Lua e scegliendo la libreria Java (NIO) giusta per migliorare le prestazioni. Non riesco a immaginare niente di più amichevole e semplice da usare di Redis.
Moose on the Loose

105

Memcached è multithread e veloce.

Redis ha molte funzionalità ed è molto veloce, ma completamente limitato a un core in quanto si basa su un loop di eventi.

Usiamo entrambi. Memcached viene utilizzato per la memorizzazione nella cache degli oggetti, riducendo principalmente il carico di lettura sui database. Redis è usato per cose come set ordinati che sono utili per il rollup dei dati delle serie temporali.


2
I siti ad alto traffico che sono pesantemente investiti in memcached e che hanno colli di bottiglia di db su dati non relazionali simili a "profilo utente" dovrebbero valutare il couchbase in parallelo con il solito Mongo, Redis

2
@siliconrockstar - abbastanza sicuro Redis 3 è ancora single core; almeno AWS Redis (che utilizza 3.2.6 o 3.2.10) avverte di tenerne conto quando si osservano ad esempio le metriche
EngineCpuUtilization

1
Sembra che tu abbia ragione, penso che quando ho fatto quel commento lo stavo basando su fonti incomplete. Commento cancellato.
siliconrockstar,

ma puoi ancora lanciare $ core_count istanze di Redis
Imaskar il

2
Redis è estremamente focalizzato sull'efficienza - quindi devi chiederti perché un gruppo di sviluppatori intelligenti ha scelto di mantenerlo single thread? Dai documenti redis "Non è molto frequente che la CPU diventi il ​​collo di bottiglia con Redis, come di solito Redis è legato alla memoria o alla rete". Se dovessi utilizzare un server grunty che era associato alla CPU, probabilmente avrai molti utenti e dovresti comunque avere più server ridondanti. Se vuoi massimizzare più CPU su un singolo server, usa il partizionamento. Leggi: redis.io/topics/…
robocat,

91

È troppo lungo per essere pubblicato come commento a una risposta già accettata, quindi l'ho inserito come risposta separata

Una cosa da considerare è anche se ci si aspetta di avere un limite massimo di memoria superiore nell'istanza della cache.

Poiché redis è un database nosql con tonnellate di funzionalità e la memorizzazione nella cache è solo un'opzione per cui può essere utilizzata, alloca la memoria quando ne ha bisogno: più oggetti ci metti, più memoria usa. L' maxmemoryopzione non applica rigorosamente l'utilizzo del limite di memoria superiore. Mentre lavori con la cache, le chiavi vengono eliminate e scadute; è probabile che le tue chiavi non abbiano tutte le stesse dimensioni, quindi si verifica una frammentazione della memoria interna.

Per impostazione predefinita, redis utilizza l'allocatore di memoria jemalloc , che fa del suo meglio per essere compatto e veloce sia nella memoria, ma è un allocatore di memoria per scopi generici e non può tenere il passo con molte allocazioni e l'eliminazione degli oggetti che si verificano ad alta velocità. Per questo motivo, su alcuni schemi di caricamento il processo redis può apparentemente perdere la memoria a causa della frammentazione interna. Ad esempio, se si dispone di un server con 7 Gb di RAM e si desidera utilizzare redis come cache LRU non persistente, è possibile che il processo di redis maxmemoryimpostato su 5Gb nel tempo utilizzi sempre più memoria, raggiungendo infine il limite totale di RAM fino a il killer di memoria insufficiente interferisce.

memcached si adatta meglio allo scenario sopra descritto, poiché gestisce la sua memoria in un modo completamente diverso. memcached alloca un grosso pezzo di memoria - tutto ciò di cui avrà mai bisogno - e quindi gestisce questa memoria da sola, usando il proprio allocatore di lastre implementato . Inoltre, memcached si impegna a mantenere bassa la frammentazione interna, poiché utilizza effettivamente l'algoritmo LRU per lastra , quando gli sfratti LRU vengono eseguiti tenendo conto della dimensione dell'oggetto.

Detto questo, memcached ha ancora una posizione forte negli ambienti, dove l'uso della memoria deve essere imposto e / o prevedibile. Abbiamo provato a utilizzare l'ultimo redis stabile (2.8.19) come sostituzione memcached basata su LRU non persistente drop-in in un carico di lavoro di 10-15k op / s, e ha fatto trapelare MOLTA memoria; lo stesso carico di lavoro stava arrestando in modo anomalo le istanze redis di Amazon ElastiCache in circa un giorno a causa degli stessi motivi.


2
Da redis.io/topics/faq : Redis ha protezioni integrate che consentono all'utente di impostare un limite massimo per l'utilizzo della memoria, utilizzando l'opzione maxmemory nel file di configurazione per mettere un limite alla memoria che Redis può usare. Se questo limite viene raggiunto, Redis inizierà a rispondere con un errore di scrittura dei comandi (ma continuerà ad accettare comandi di sola lettura), oppure è possibile configurarlo per eliminare i tasti quando viene raggiunto il limite massimo di memoria nel caso in cui si stia utilizzando Redis per la memorizzazione nella cache. Abbiamo documentazione se prevedi di utilizzare Redis come cache LRU. link
StefanNch

8
L' maxmemoryopzione @StefanNch redis non tiene conto della frammentazione della memoria interna. Per i dettagli, vedere il mio commento sopra: i problemi che ho descritto sono stati osservati nello scenario descritto nella pagina "Redis come cache LRU" con le opzioni di limitazione della memoria abilitate. memcached, d'altra parte, utilizza un approccio diverso per evitare problemi di frammentazione della memoria, quindi il suo limite di memoria è molto più "difficile".
arttyom

46

Memcached è bravo a essere un semplice archivio chiave / valore ed è bravo a fare key => STRING. Questo lo rende davvero buono per l'archiviazione della sessione.

Redis è bravo a fare key => SOME_OBJECT.

Dipende davvero da cosa ci metterai dentro. La mia comprensione è che in termini di prestazioni sono abbastanza uniformi.

Buona fortuna anche a trovare parametri di riferimento oggettivi, se ne trovi qualcuno manda gentilmente a modo mio.


2
IMO, il tipo di dati Redis Hash ha molto più senso per la memorizzazione delle variabili di sessione piuttosto che serializzarle in una stringa memcached.
Carl Zulauf,

6
Se ti interessa l'esperienza utente, non mettere le sessioni nella cache. dormando.livejournal.com/495593.html
sleblanc

4
@sebleblanc Questo non dovrebbe teoricamente essere un problema con Redis, poiché esiste anche la persistenza del disco.
Haknick,

2
@sebleblanc memcache è ancora valido per l'archiviazione della sessione, lo si implementa male o no. sì lo sfratto è un problema ma non è insormontabile, inoltre non è un problema di memcache se non ti preoccupi dello sfratto. Credo che la maggior parte delle soluzioni di sessione memcache utilizzino i cookie come backup.
Erik Petersen,

11
"Non mettere le sessioni nella cache" è fuorviante. Quello che vuoi dire è "Non solo memorizzare le sessioni nella cache". Chiunque memorizzi solo dati importanti in memcache dovrebbe essere licenziato immediatamente.
Jacob,

37

Se non ti dispiace uno stile di scrittura grossolano, Redis vs Memcached sul blog Systoilet merita una lettura dal punto di vista dell'usabilità, ma assicurati di leggere avanti e indietro nei commenti prima di trarre conclusioni sulla performance; ci sono alcuni problemi metodologici (test a ciclo occupato a thread singolo) e Redis ha apportato alcuni miglioramenti da quando è stato scritto anche l'articolo.

E nessun collegamento di benchmark è completo senza confondere un po 'le cose, quindi controlla anche alcuni benchmark contrastanti su LiveJournal di Dormondo e sul weblog di Antirez .

Modifica - come sottolinea Antirez, l'analisi di Systoilet è piuttosto mal concepita. Anche al di là del deficit di single threading, gran parte della disparità di prestazioni in questi benchmark può essere attribuita alle librerie client piuttosto che alla velocità effettiva del server. I parametri di riferimento nel weblog di Antirez presentano in effetti un confronto molto più da mele a mele (con la stessa bocca).



28
Non stavi scherzando su Crass.
ocodo

1
Più del 2010, blog obsoleto
Siddharth,

24

Ho avuto l'opportunità di usare sia memcached che redis insieme nel proxy di cache su cui ho lavorato, lascia che ti condivida esattamente dove ho usato cosa e ragione dietro lo stesso ....

Redis>

1) Utilizzato per indicizzare il contenuto della cache, sul cluster. Ho più di miliardi di chiavi distribuite su cluster redis, i tempi di risposta redis sono piuttosto inferiori e stabili.

2) Fondamentalmente, è un archivio chiave / valore, quindi ovunque nella tua applicazione hai qualcosa di simile, puoi usare redis con fastidio molto.

3) La persistenza, il failover e il backup di Redis (AOF) semplificheranno il lavoro.

Memcache>

1) sì, una memoria ottimizzata che può essere utilizzata come cache. L'ho usato per archiviare il contenuto della cache accedendo molto frequentemente (con 50 hit / secondo) con dimensioni inferiori a 1 MB.

2) Ho assegnato solo 2 GB su 16 GB per memcached anche quando la mia dimensione del contenuto singolo era> 1 MB.

3) Man mano che il contenuto cresce vicino ai limiti, di tanto in tanto ho osservato tempi di risposta più alti nelle statistiche (non nel caso dei redis).

Se si richiede esperienza complessiva, Redis è molto ecologico in quanto è facile da configurare, molto flessibile con funzionalità stabili e robuste.

Inoltre, a questo link è disponibile un risultato di benchmarking , di seguito sono riportati alcuni higlight dello stesso,

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Spero che sia di aiuto!!


14

Test. Esegui alcuni semplici benchmark. Per molto tempo mi sono considerato un rinoceronte della vecchia scuola da quando ho usato principalmente memcached e ho considerato Redis il nuovo bambino.

Con la mia attuale azienda, Redis è stato utilizzato come cache principale. Quando ho analizzato alcune statistiche sulle prestazioni e ho semplicemente iniziato i test, Redis era, in termini di prestazioni, comparabile o minimamente più lento di MySQL.

Memcached, sebbene semplicistico, fece esplodere totalmente Redis . Si è ridimensionato molto meglio:

  • per valori più grandi (modifica richiesta nella dimensione della soletta, ma ha funzionato)
  • per più richieste simultanee

Inoltre, a mio avviso, la politica di sfratto memcached è molto meglio implementata, con conseguente tempo medio di risposta medio più stabile mentre si gestiscono più dati di quanti ne possano gestire la cache.

Alcuni benchmark hanno rivelato che Redis, nel nostro caso, ha prestazioni molto scarse. Questo credo che abbia a che fare con molte variabili:

  • il tipo di hardware su cui esegui Redis
  • tipi di dati che memorizzi
  • quantità di prese e set
  • quanto è simultanea la tua app
  • è necessario l'archiviazione della struttura dei dati

Personalmente, non condivido l'opinione che gli autori di Redis hanno sulla concorrenza e sul multithreading.


spiega "minimamente più lento di MySQL".
Anirudha Gupta,

A dire il vero non ho questi dati di riferimento a portata di mano, ma quel caso particolare era un sacco di operazioni di lettura / scrittura
mdomans

13

Un altro vantaggio è che può essere molto chiaro come si comporterà memcache in uno scenario di cache, mentre redis è generalmente usato come archivio dati persistente, anche se può essere configurato per comportarsi proprio come memcached aka che sfrutta gli elementi utilizzati meno di recente quando raggiunge il massimo capacità.

Alcune app su cui ho lavorato usano entrambe solo per chiarire come intendiamo comportarci i dati - cose in memcache, scriviamo codice per gestire i casi in cui non ci sono - cose in redis, contiamo sul fatto che siano lì .

A parte questo, Redis è generalmente considerato superiore per la maggior parte dei casi d'uso, essendo più ricco di funzionalità e quindi flessibile.


10

Non sarebbe sbagliato se dicessimo che redis è una combinazione di (cache + struttura dati) mentre memcached è solo una cache.


1
questa è una buona risposta - Laravel utilizza Redis come cache e come meccanismo di archiviazione dei dati
Miroslav Trninic,

8

Un test molto semplice per impostare e ottenere 100k chiavi e valori univoci rispetto a redis-2.2.2 e memcached. Entrambi sono in esecuzione su VM Linux (CentOS) e il mio codice client (incollato di seguito) viene eseguito sul desktop di Windows.

Redis

  • Il tempo impiegato per memorizzare 100000 valori è = 18954ms

  • Il tempo impiegato per caricare 100000 valori è = 18328 ms

memcached

  • Il tempo impiegato per memorizzare 100000 valori è = 797ms

  • Il tempo impiegato per recuperare 100000 valori è = 38984ms


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

6
Dato che ovviamente hai usato Java per misurare .... hai "riscaldato" i tuoi casi di test? Questo è essenziale per misurare in così poco tempo ... che la JIT ha compilato i punti caldi.
cljk,

7

Una grande differenza che non è stata evidenziata qui è che Memcache ha sempre un limite di memoria superiore, mentre Redis non lo fa di default (ma può essere configurato per). Se vuoi sempre memorizzare una chiave / valore per un certo periodo di tempo (e non sfrattarlo mai a causa della memoria insufficiente), vuoi andare con Redis. Naturalmente, si rischia anche il problema di rimanere senza memoria ...


6

Il motivo principale rimasto è la specializzazione.

Redis può fare molte cose diverse e un effetto collaterale di ciò è che gli sviluppatori possono iniziare a utilizzare molte di queste diverse serie di funzioni nella stessa istanza. Se stai usando la funzione LRU di Redis per una cache lungo l'archiviazione di dati hard laterale che NON è LRU, è del tutto possibile esaurire la memoria.

Se hai intenzione di configurare un'istanza Redis dedicata da usare SOLO come istanza LRU per evitare quel particolare scenario, allora non c'è davvero alcun motivo convincente per usare Redis su Memcached.

Se hai bisogno di una cache LRU affidabile "non si abbassa mai" ... Memcached si adatta al conto poiché è impossibile che finisca la memoria in base alla progettazione e la funzionalità specializzata impedisce agli sviluppatori di provare a renderlo così qualcosa che potrebbe metterlo in pericolo. Semplice separazione delle preoccupazioni.


6

Memcached sarà più veloce se sei interessato alle prestazioni, anche perché Redis prevede il networking (chiamate TCP). Anche internamente Memcache è più veloce.

Redis ha più funzionalità come è stato menzionato da altre risposte.


6

Abbiamo pensato a Redis come un decollo per il nostro progetto al lavoro. Abbiamo pensato che usando un modulo nginxchiamato HttpRedis2Moduleo qualcosa di simile avremmo avuto una velocità incredibile, ma durante i test con AB-test ci siamo dimostrati sbagliati.

Forse il modulo era difettoso o il nostro layout, ma era un compito molto semplice ed era ancora più veloce prendere i dati con php e poi inserirli in MongoDB. Stiamo usando APC come sistema di cache e con quel php e MongoDB. Era molto più veloce del nginxmodulo Redis.

Il mio consiglio è di testarlo tu stesso, mostrandoti i risultati per il tuo ambiente. Abbiamo deciso che l'utilizzo di Redis non era necessario nel nostro progetto in quanto non avrebbe alcun senso.


Risposta interessante ma non sono sicuro che aiuti l'OP
Scott Schulthess il

L'inserimento in Redis e l'utilizzo come cache era più lento rispetto all'utilizzo di APC + PHP + MongoDB. Ma solo l'inserimento in Redis è stato MOLTO più lento dell'inserimento diretto in MongoDB. Senza APC penso che siano abbastanza uguali.
Ms01,

2
Questo perché mongo non ti dà alcuna garanzia che ciò che hai inserito sarà mai scritto su disco ...
Damian,

21
ma è Webscale, mongodb ti circolerà in cerchio mentre scrivi. Oggi scrivo solo su / dev / null perché è il più veloce.
Ms01

1

Redis è meglio.

I pro di Redissono,

  1. Ha molte opzioni di archiviazione dei dati come stringa, set, set ordinati, hash, bitmap
  2. Persistenza del disco dei record
  3. LUASupporto per Stored procedure ( scripting)
  4. Può agire come un broker di messaggi utilizzando PUB / SUB

Considerando che Memcacheè un sistema di tipo cache valore chiave in memoria.

  1. Nessun supporto per vari tipi di dati come elenchi, set come in redis.
  2. Il principale svantaggio è che Memcache non ha persistenza del disco.

0

Beh, per lo più ho usato entrambi con le mie app, Memcache per memorizzare nella cache le sessioni e redis per oggetti query dottrine / orm. In termini di prestazioni, entrambi sono quasi uguali.


0

Ecco il fantastico articolo / differenze fornito da Amazon

Redis è un chiaro vincitore rispetto a memcached.

Solo un punto in più per Memcached È multithread e veloce. Redis ha molte fantastiche funzioni ed è molto veloce, ma limitato a un core.

Ottimi punti su Redis, che non sono supportati in Memcached

  • Istantanee - L'utente può acquisire un'istantanea della cache di Redis e persistere nella memoria secondaria in qualsiasi momento.
  • Supporto integrato per molte strutture di dati come Set, Map, SortedSet, List, BitMaps ecc.
  • Supporto per lo scripting Lua in redis
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.