Redis
 sql >> Database >  >> NoSQL >> Redis

Memcached contro Redis?

Riepilogo (TL;DR)

Aggiornato il 3 giugno 2017

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

Per qualsiasi cosa nuova, usa Redis.

Memcached vs Redis:confronto diretto

Entrambi gli strumenti sono archivi dati in memoria potenti, veloci e utili come cache. Entrambi possono aiutare a velocizzare 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

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

  • Velocità di lettura/scrittura :Entrambi sono estremamente veloci. I benchmark variano in base al carico di lavoro, alle versioni e a molti altri fattori, ma generalmente mostrano che redis è veloce o quasi quanto memcached. Raccomando redis, ma non perché memcached sia lento. Non lo è.
  • Utilizzo della memoria :Redis è migliore.
    • memcached:specifichi la dimensione della cache e man mano che inserisci gli elementi il ​​demone cresce rapidamente fino a raggiungere una dimensione leggermente superiore a questa dimensione. Non c'è mai davvero un modo per reclamare nessuno di quello spazio, a meno di riavviare memcached. Tutte le tue chiavi potrebbero essere scadute, potresti svuotare il database e continuerebbe a utilizzare l'intero blocco di RAM con cui lo hai configurato.
    • redis:l'impostazione di una dimensione massima dipende da te. Redis non utilizzerà mai più del necessario e ti restituirà la memoria che non utilizza più.
    • Ho memorizzato 100.000 stringhe da ~2KB (~200MB) di frasi casuali in entrambi. L'utilizzo della RAM memorizzata è cresciuto fino a circa 225 MB. L'utilizzo della RAM Redis è cresciuto fino a circa 228 MB. Dopo aver scaricato entrambi, Redis è sceso a ~29 MB e memcached è rimasto a ~225 MB. Sono altrettanto efficienti nel modo in cui archiviano i dati, ma solo uno è in grado di recuperarli.
  • Uscita I/O del disco :Una chiara vittoria per redis poiché lo fa per impostazione predefinita e ha una persistenza molto configurabile. Memcached non ha meccanismi per eseguire il dump su disco senza strumenti di terze parti.
  • Ridimensionamento :Entrambi ti danno un sacco di spazio libero prima di aver bisogno di più di una singola istanza come cache. Redis include strumenti per aiutarti ad andare oltre, mentre memcached no.

memcached

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

È bravo in questo, ma è tutto ciò che fa. Puoi accedere a questi valori tramite 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 sono spariti. Questo va bene per una cache. Non dovresti archiviare nulla di importante lì.

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

ridi

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

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

Puoi disattivare la persistenza e perderà felicemente i tuoi dati anche al riavvio. Se vuoi che la tua cache sopravviva ai riavvii, ti consente di farlo anche tu. In effetti, questa è l'impostazione predefinita.

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

Se un'istanza di redis/memcached non ha prestazioni sufficienti per il tuo carico di lavoro, redis è la scelta giusta. Redis include il supporto del cluster e viene fornito con strumenti ad alta disponibilità (redis-sentinel) direttamente "in the box". Negli ultimi anni redis è anche emerso come il leader indiscusso degli strumenti di terze parti. Aziende come Redis Labs, Amazon e altre offrono molti utili strumenti e servizi redis. L'ecosistema intorno a Redis è molto più ampio. Il numero di implementazioni su larga scala ora è probabilmente maggiore di quello di memcached.

Il Superset Redis

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 a 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 di memcached. Anche se questo può essere soggettivo, sembra sempre più vero.

redis.io è una fantastica risorsa facilmente navigabile. Ti consente di provare Redis nel browser e ti offre persino esempi interattivi dal vivo con ogni comando nei documenti.

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

Persistenza

Per impostazione predefinita, redis mantiene i tuoi 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 degrado delle prestazioni. È quasi gratis!

Nella modalità snapshot esiste la possibilità che un arresto anomalo improvviso possa causare una piccola perdita di dati. Se hai assolutamente bisogno di assicurarti che nessun dato venga mai perso, non preoccuparti, anche Redis ti dà le spalle con la modalità AOF (Append Only File). In questa modalità di persistenza i dati possono essere sincronizzati su disco mentre vengono scritti. Ciò può ridurre la velocità effettiva di scrittura massima alla velocità di scrittura del disco, ma dovrebbe comunque essere abbastanza veloce.

Ci sono molte opzioni di configurazione per ottimizzare la persistenza se necessario, ma le impostazioni predefinite sono molto ragionevoli. Queste opzioni semplificano la configurazione di redis come luogo sicuro e ridondante in cui archiviare i dati. È un reale banca dati.

Molti tipi di dati

Memcached è limitato alle stringhe, ma Redis è un server di struttura dati che può servire molti tipi di dati diversi. Fornisce inoltre i comandi necessari per ottenere il massimo da questi tipi di dati.

Stringhe (comandi)

Testo semplice o valori binari che possono avere dimensioni fino a 512 MB. Questo è l'unico tipo di dati redis e condivisione memcached, sebbene le stringhe memcached siano limitate a 1 MB.

Redis offre più strumenti per sfruttare questo tipo di dati offrendo comandi per operazioni bit per 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 sorta di archivio di valori chiave all'interno di un archivio di valori chiave. Mappano tra campi stringa e valori di stringa. Campo->le mappe dei valori che utilizzano un hash sono leggermente più efficienti in termini di spazio rispetto alle chiavi->le mappe dei valori che utilizzano stringhe regolari.

Gli hash sono utili come spazio dei nomi o quando vuoi 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 è per la memorizzazione di profili utente tra le applicazioni. Un hash redis memorizzato con l'ID utente come chiave ti consentirà di archiviare tutti i bit di dati necessari su un utente mantenendoli archiviati in un'unica chiave. Il vantaggio dell'utilizzo di un hash invece di serializzare il profilo in una stringa è che puoi fare in modo che applicazioni diverse leggano/scrivano campi diversi all'interno del profilo utente senza doversi preoccupare che un'app sovrascriva le modifiche apportate da altre (cosa che può accadere se si serializza dati).

Elenchi (comandi)

Le liste Redis sono raccolte ordinate di stringhe. Sono ottimizzati per inserire, leggere o rimuovere valori dalla parte superiore o inferiore (ovvero:sinistra o destra) dell'elenco.

Redis fornisce molti comandi per sfruttare gli elenchi, inclusi i comandi per eseguire il push/pop di elementi, il push/pop tra elenchi, troncare gli elenchi, eseguire query di intervallo, ecc.

Gli elenchi creano grandi code durevoli, atomiche. Funzionano perfettamente per code di lavoro, registri, buffer e molti altri casi d'uso.

Insiemi (comandi)

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

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

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

Insiemi ordinati (comandi)

Gli insiemi ordinati sono anche raccolte di valori univoci. Questi, come suggerisce il nome, sono ordinati. Sono ordinati in base a un punteggio, quindi lessicograficamente.

Questo tipo di dati è ottimizzato per ricerche rapide in base al punteggio. Ottenere il valore più alto, più basso o qualsiasi intervallo di valori intermedio è 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 più alti, aggiungili di nuovo 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.

La memorizzazione di valori con lo stesso punteggio fa sì che vengano ordinati lessicograficamente (pensa in ordine alfabetico). Questo può essere utile per cose come le funzioni di completamento automatico.

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

Geo

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

Tecnicamente i dati geografici in redis sono archiviati all'interno di insiemi ordinati, quindi questo non è un tipo di dati veramente separato. È più un'estensione sopra i 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 di stringa come se fossero una bitmap o un hyperlog.

Le bitmap sono ciò che gli operatori a livello di bit a cui ho fatto riferimento in Strings sono per. Questo tipo di dati è stato l'elemento fondamentale per il recente progetto artistico collaborativo di reddit:r/Place.

HyperLogLog ti consente di utilizzare una quantità di spazio estremamente ridotta costante per contare valori univoci quasi illimitati con una precisione scioccante. Usando solo ~16KB potresti contare in modo efficiente il numero di visitatori unici del tuo sito, anche se quel numero è di 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 è necessario attendere che quel valore si propaghi. Anche tecnicamente memcached è atomico, ma con redis che aggiunge tutte queste funzionalità oltre a memcached, vale la pena notare e in qualche modo impressionante che tutti questi tipi di dati e funzionalità aggiuntivi sono anche atomici.

Sebbene non sia esattamente la stessa cosa delle transazioni nei database relazionali, redis ha anche transazioni che utilizzano il "blocco ottimistico" (WATCH/MULTI/EXEC).

Condutture

Redis fornisce una funzionalità chiamata "pipelining". Se desideri eseguire molti comandi redis, puoi utilizzare il pipelining per inviarli a redis tutti in una volta anziché 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ò consentirti di ottenere un throughput ancora maggiore durante l'importazione in blocco o altre azioni che richiedono molti comandi.

Pub/Sub

Redis ha comandi dedicati alla funzionalità pub/sub, consentendo a redis di agire come un'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. Broker di messaggi dedicati come RabbitMQ possono presentare vantaggi in alcune aree, ma il fatto che lo stesso server possa anche darti code durevoli persistenti e altre strutture di dati probabilmente necessarie ai tuoi carichi di lavoro pub/sub, Redis si rivelerà spesso lo strumento migliore e più semplice per il lavoro.

Scripting Lua

Puoi pensare a script lua come l'SQL o le stored procedure di redis. È sia più che meno, ma l'analogia funziona per lo più.

Forse hai calcoli complessi che vuoi che Redis esegua. Forse non puoi permetterti di ripristinare le tue transazioni e hai bisogno di garanzie che ogni fase di un processo complesso avvenga in modo atomico. Questi problemi e molti altri possono essere risolti con lo scripting lua.

L'intero script viene eseguito in modo atomico, quindi se riesci a inserire la tua logica in uno script lua puoi spesso evitare di pasticciare con transazioni di blocco ottimistiche.

Ridimensionamento

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

Conclusione

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

Quanto sopra potrebbe suonare come se non mi piace memcached. Al contrario:è uno strumento potente, semplice, stabile, maturo e temprato. Ci sono anche alcuni casi d'uso in cui è un po' più veloce di redis. Amo memcached. Non penso che abbia molto senso per lo sviluppo futuro.

Redis fa tutto ciò che fa memcached, spesso meglio. Qualsiasi vantaggio in termini di prestazioni per memcached è minore e specifico del carico di lavoro. Ci sono anche carichi di lavoro per i quali Redis sarà più veloce e molti altri carichi di lavoro che Redis può eseguire e che memcached semplicemente non può. Le minuscole differenze di prestazioni sembrano minime di fronte all'enorme divario in termini di funzionalità e al fatto che entrambi gli strumenti sono così veloci ed efficienti che potrebbero benissimo essere l'ultimo pezzo della tua infrastruttura di cui dovrai mai preoccuparti di ridimensionare.

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 utilizzerai redis solo per la memorizzazione nella cache, potrebbe non offrire abbastanza vantaggi per valere il tuo tempo. Se memcached non soddisfa le tue esigenze, probabilmente dovresti passare a redis. Questo è vero se devi scalare oltre memcached o hai bisogno di funzionalità aggiuntive.