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