caching - redis vs memcached




Memcached vs. Redis? (12)

Riepilogo (TL; DR)

Aggiornato il 3 giugno 2017

Redis è più potente, più popolare e meglio supportato rispetto a memcached. Memcached può solo fare 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 consentono di 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

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

  • Velocità di lettura / scrittura : entrambi sono estremamente veloci. I benchmark variano a seconda del carico di lavoro, delle versioni e di molti altri fattori, ma generalmente mostrano che i redis sono veloci o quasi veloci come memcached. Raccomando redis, ma non perché memcached è lento. Non è.
  • Utilizzo della memoria : Redis è migliore.
    • memcached: si specifica la dimensione della cache e, mentre si inseriscono gli elementi, il demone diventa rapidamente un po 'più grande di questa dimensione. Non c'è mai veramente un modo per reclamare nessuno di quello spazio, prima di riavviare memcached. Tutte le chiavi potrebbero essere scadute, è possibile svuotare il database e utilizzare comunque il blocco completo della RAM con cui è stato configurato.
    • redis: impostare una dimensione massima dipende da te. Redis non userà mai più di quanto deve e ti restituirà la memoria che non utilizza più.
    • Ho memorizzato 100.000 ~ 2 KB di stringhe (~ 200 MB) di frasi casuali in entrambi. L'utilizzo di RAM Memcached è aumentato a ~ 225 MB. L'utilizzo della RAM di Redis è aumentato a ~ 228 MB. Dopo il flushing entrambi, i redis sono scesi a ~ 29MB e memcached è rimasto a ~ 225MB. Sono altrettanto efficienti nel modo in cui memorizzano i dati, ma solo uno è in grado di recuperarli.
  • Discarica I / O su disco : una chiara vincita per i 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 danno un sacco di spazio mentale 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.

È buono a questo, ma è tutto ciò che fa. È possibile accedere a tali 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 sono spariti. Questo va bene per un cache. Non dovresti memorizzare nulla di importante lì.

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

Redis

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

Anche i redis possono fungere da cache . Può memorizzare anche coppie chiave / valore. In redis possono essere anche fino a 512 MB.

Puoi disattivare la persistenza e perderà felicemente anche i tuoi dati al riavvio. Se vuoi che la cache sopravviva, puoi farlo anche tu. In effetti, questo è l'impostazione predefinita.

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

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

Il Redis Superset

Redis è più di un 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 di valori / chiavi come memcached. La maggior parte delle funzionalità di redis sono cose che memcached non può fare.

Documentazione

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

redis.io è una fantastica risorsa facilmente navigabile. Ti consente di provare i redis nel browser e persino di fornire esempi interattivi dal vivo con ciascun comando nei documenti.

Ora ci sono 2 volte il maggior numero di risultati StackOverflow per redis come memcached. 2x tanti 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'immagine chiara che il supporto e la documentazione per redis è maggiore e molto più aggiornata.

Persistence

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

Nella modalità snapshot esiste la possibilità che un arresto improvviso possa causare una piccola quantità di dati persi. Se hai assolutamente bisogno di assicurarti che nessun dato sia mai perso, non preoccuparti, redis ha la tua schiena anche in modalità AOF (Aggiungi solo file). In questa modalità di persistenza i dati possono essere sincronizzati su disco come è scritto. Ciò può ridurre il massimo throughput di scrittura a quello che il disco può scrivere velocemente, ma dovrebbe comunque essere abbastanza veloce.

Ci sono molte opzioni di configurazione per mettere a punto la persistenza, se necessario, ma i valori di default sono molto ragionevoli. Queste opzioni semplificano l'installazione di redis come luogo sicuro e ridondante per archiviare i 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 anche i comandi necessari per sfruttare al meglio questi tipi di dati.

Stringhe ( commands )

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 ulteriori strumenti per sfruttare questo tipo di dati offrendo comandi per operazioni bit a bit, manipolazione a livello di bit, supporto di incremento / decremento in virgola mobile, query di intervallo e operazioni con più tasti. Memcached non supporta nessuno di questi.

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

Hash ( commands )

Gli hash sono un po 'come un archivio di valori chiave all'interno di un archivio di valori chiave. Si mappano tra campi stringa e valori stringa. Campo-> mappe valore utilizzando un hash sono leggermente più efficienti rispetto alle mappe chiave-> valore utilizzando stringhe regolari.

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

Un esempio di utilizzo di un hash è per la memorizzazione dei profili utente tra le applicazioni. Un hash redis memorizzato con l'ID utente in quanto la chiave consente di archiviare il numero di bit di dati relativi a un utente, se necessario, mantenendoli memorizzati in un'unica chiave. Il vantaggio di utilizzare un hash invece di serializzare il profilo in una stringa è che si possono avere diverse applicazioni di lettura / scrittura di campi diversi all'interno del profilo utente senza doversi preoccupare di un'app che sovrascrive le modifiche apportate da altri (cosa che può accadere se si serializza non aggiornato dati).

Elenchi ( commands )

Gli elenchi di Redis sono raccolte di stringhe ordinate. Sono ottimizzati per l'inserimento, la lettura o la rimozione di valori dall'alto o dal basso (ovvero: sinistra o destra) dell'elenco.

Redis fornisce molti commands per sfruttare gli elenchi, inclusi i comandi per spingere / inserire elementi, spingere / inserire gli elenchi, troncare gli elenchi, eseguire query di intervallo, ecc.

Le liste fanno lunghe code resistenti, atomiche. Funzionano perfettamente per code di lavoro, log, buffer e molti altri casi d'uso.

Imposta ( commands )

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

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

Redis fornisce diversi commands per gestire i set. Quelli ovvi come aggiungere, rimuovere e controllare il set sono presenti. Quindi sono comandi meno ovvi come scattare / leggere un oggetto casuale e comandi per eseguire unioni e intersezioni con altri set.

Set ordinati ( commands )

I set ordinati sono anche raccolte di valori unici. 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 in mezzo è estremamente veloce.

Se aggiungi utenti a un set ordinato insieme al loro punteggio più alto, hai una classifica perfetta. Con l'arrivo di nuovi punteggi migliori, aggiungili nuovamente al set con il loro punteggio più alto e ordinerai di nuovo la tua classifica. Ottimo anche per tenere traccia dell'ultima volta che gli utenti hanno visitato e chi è attivo nella tua applicazione.

Memorizzare i valori con lo stesso punteggio li fa ordinare lessicograficamente (pensare in ordine alfabetico). Questo può essere utile per cose come le funzioni di completamento automatico.

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

Geo

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

I dati geografici tecnicamente in rosso vengono memorizzati all'interno di set 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 consentono di trattare i dati di stringa come se fossero bitmap o hyperloglog.

Le bitmap sono a cosa servono gli operatori a livello di bit a cui ho fatto riferimento in Strings . Questo tipo di dati è stato il componente base del recente progetto artistico collaborativo di reddit: r/Place .

HyperLogLog ti consente di utilizzare una quantità di spazio costante estremamente ridotta per contare valori unici pressoché illimitati con una precisione scioccante. Usando solo ~ 16KB 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 rosso sono atomici, nel senso che puoi essere sicuro che non appena scrivi un valore per ridisegnare quel valore è visibile a tutti i client connessi ai redis. Non c'è attesa che il valore si propaghi. 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.

Anche se non è esattamente la stessa cosa delle transazioni nei database relazionali, redis ha anche transactions che usano "locking ottimistico" ( WATCH / MULTI / EXEC ).

pipelining

Redis fornisce una funzionalità chiamata " pipelining ". Se si dispone di molti comandi redis che si desidera eseguire, è possibile utilizzare il pipelining per inviarli a redis all-at-once 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 una singola risposta.

Ciò può consentire di ottenere un throughput ancora maggiore per l'importazione di massa o altre azioni che coinvolgono molti comandi.

Pub / Sub

Redis ha commands dedicati alle funzionalità di pubblicazione / sottotitoli , consentendo ai redis di agire come un'emittente di messaggi ad alta velocità. Ciò consente a un singolo client di pubblicare messaggi su molti altri client connessi a un canale.

Redis fa pub / sub così come quasi tutti gli strumenti. I broker di messaggi dedicati come RabbitMQ possono avere vantaggi in determinate aree, ma il fatto che lo stesso server possa anche fornire costanti code permanenti e altre strutture di dati probabilmente necessarie per i carichi di lavoro pub / sub, Redis si rivelerà spesso lo strumento migliore e più semplice per il lavoro.

Lua Scripting

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

Forse hai calcoli complessi che vuoi eseguire con i redis. Forse non puoi permetterti di far retrocedere 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 lo scripting lua.

L'intero script è eseguito atomicamente, quindi se si può adattare la logica in uno script lua è spesso possibile evitare di fare confusione con transazioni di blocco ottimistiche.

scalata

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

Conclusione

Senza esitazione raccomanderei redis su memcached per eventuali nuovi progetti, o progetti esistenti che non usano già memcached.

Quanto sopra può sembrare che non mi piace 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 memorizza, spesso meglio. Qualsiasi vantaggio in termini di prestazioni per memcached è minore e specifico del carico di lavoro. Esistono anche carichi di lavoro per i quali i redis risulteranno più veloci e molti più carichi di lavoro che i redis possono fare, che semplicemente memcached non può fare. Le minime differenze di prestazioni sembrano minori di fronte al gigantesco divario di funzionalità e il fatto che entrambi gli strumenti siano così veloci ed efficienti potrebbero essere l'ultimo pezzo della tua infrastruttura che dovrai mai preoccupare del ridimensionamento.

C'è solo uno scenario in cui memcached ha più senso: dove memcached è già in uso come cache. Se si sta già memorizzando nella cache con memcached, continuare a utilizzarlo, se soddisfa le proprie esigenze. Probabilmente non vale la pena di passare ai redis e se si utilizzano i redis solo per il caching, potrebbe non offrire un beneficio sufficiente per valere il proprio 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.

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

Cosa ci darà prestazioni migliori? Qualche pro o contro tra Redis e Memcached?

Punti da considerare:

  • Velocità di lettura / scrittura.
  • Utilizzo della memoria.
  • Discarica I / O su disco.
  • Scaling.

Abbiamo pensato a Redis come al decollo del nostro progetto al lavoro. Abbiamo pensato che usando un modulo in nginx chiamato HttpRedis2Module o qualcosa di simile avremmo una velocità incredibile, ma quando proviamo con il test AB ci siamo sbagliati.

Forse il modulo era cattivo 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 caching e con quel php e MongoDB. Era molto più veloce del modulo Nginx Redis.

Il mio consiglio è di testarlo da solo, facendo questo ti mostrerà 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.


Ho avuto l'opportunità di usare sia memcached che redis insieme nel proxy di caching su cui ho lavorato, permettetemi di condividervi dove esattamente ho usato cosa e la ragione dietro allo stesso ....

Redis>

1) Utilizzato per indicizzare il contenuto della cache, sul cluster. Ho più di un miliardo di chiavi distribuite sui cluster redis, i tempi di risposta dei redis sono piuttosto bassi e stabili.

2) Fondamentalmente, è un archivio di chiavi / valori, quindi se mai nella tua applicazione hai qualcosa di simile, puoi usare redis con molto disturbo.

3) Persistenza, failover e backup (AOF) di Redis semplificheranno il tuo lavoro.

Memcache>

1) sì, una memoria ottimizzata che può essere usata come cache. L'ho usato per archiviare il contenuto della cache a cui si accede molto frequentemente (con 50 colpi al secondo) con dimensioni inferiori a 1 MB.

2) Ho assegnato solo 2 GB su 16 GB per memcached anche quando il mio singolo contenuto era> 1 MB.

3) Poiché il contenuto cresce vicino ai limiti, occasionalmente ho osservato tempi di risposta più alti nelle statistiche (non nel caso dei redis).

Se chiedi un'esperienza complessiva, Redis è molto verde in quanto è facile da configurare, molto flessibile con funzionalità robuste e stabili.

Inoltre, vi è un risultato di benchmarking disponibile a questo link , di seguito sono pochi higlight dalla stessa,

Spero che questo ti aiuti!!


La più grande ragione rimasta è la specializzazione.

I redis possono fare molte cose diverse e un effetto collaterale di ciò è che gli sviluppatori possono iniziare a utilizzare molti di questi diversi set di funzionalità nella stessa istanza. Se si utilizza la funzionalità LRU di Redis per una cache sul lato dell'archiviazione dei dati rigidi che NON è LRU, è completamente possibile esaurire la memoria.

Se si intende configurare un'istanza Redis dedicata da utilizzare ESCLUSIVAMENTE come un'istanza LRU per evitare uno scenario particolare, non c'è alcun motivo valido per utilizzare Redis su Memcached.

Se hai bisogno di una cache LRU affidabile "non va mai giù" ... Memcached si adatterà al progetto perché è impossibile che esaurisca memoria per design e la funzionalità specializzata impedisce agli sviluppatori di cercare di renderlo tale da poterlo mettere in pericolo. Semplice separazione delle preoccupazioni.


Memcached è multithreaded e veloce.

Redis ha molte funzionalità ed è molto veloce, ma completamente limitato a un core poiché si basa su un ciclo di eventi.

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


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

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


Redis è meglio I pro dei Redis sono,

1.It has a lot of data storage options such  as  string  , sets , sorted sets ,  hashes ,  bitmaps
2.Disk Persistence of records 
3.Stored Procedure (LUA acripting)  support
4.Can act as a Message Broker using PUB/SUB

Considerando che Memcache è un sistema di tipo di cache dei valori delle chiavi in ​​memoria.

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

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 il back & forth nei commenti prima di trarre conclusioni sulle prestazioni; ci sono alcuni problemi metodologici (test del ciclo di lavoro a thread singolo) e Redis ha apportato alcuni miglioramenti poiché anche l'articolo è stato scritto.

E nessun link di riferimento è completo senza confondere un po 'le cose, quindi controlla anche alcuni benchmark contraddittori sul LiveJournal di Dormondo e sul Weblog di Antirez .

Modifica - come sottolinea Antirez, l'analisi di Systoilet è piuttosto mal concepita. Anche al di là della mancanza di thread singolo, gran parte della disparità di prestazioni in quei benchmark può essere attribuita alle librerie client piuttosto che al throughput del server. I parametri di riferimento di Antirez Weblog presentano infatti un confronto molto più mele-a-mele (con la stessa bocca).


Un altro vantaggio è che può essere molto chiaro come si comporterà memcache in uno scenario di memorizzazione nella cache, mentre redis viene generalmente utilizzato come archivio dati persistente, sebbene possa essere configurato per comportarsi proprio come memcached aka sfrattare oggetti meno recenti quando raggiunge il limite massimo capacità.

Alcune applicazioni su cui ho lavorato si basano entrambe per chiarire in che modo intendiamo comportarci con i dati: roba in memcache, scriviamo codice per gestire i casi in cui non è presente - roba in redis, ci basiamo su di essa .

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


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

Redis

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

  • 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 è = 38984 ms

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");

Usa Redis se

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

  2. È richiesta la possibilità di interrogare le chiavi di un particolare tipo. eq. 'blog1: post: *', 'blog2: categorie: xyz: post: *'. o si! questo è molto importante. Utilizzare questo per invalidare determinati tipi di elementi memorizzati nella cache in modo selettivo. 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 anche tu, a meno che tu non stia bene con la cache che deve scaldarsi dopo ogni riavvio. Molto essenziale per oggetti che cambiano raramente)

Usa memcached se

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

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


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

Una cosa da considerare è se si prevede di avere un limite di memoria superiore rigido nell'istanza cache.

Dal momento che redis è un database nosql con tonnellate di funzionalità e il caching è solo un'opzione per cui può essere utilizzato, alloca la memoria a seconda delle necessità: più oggetti ci metti, maggiore è la memoria che utilizza. L'opzione maxmemory non applica rigorosamente l'utilizzo del limite massimo di memoria. Mentre lavori con la cache, le chiavi vengono espulse e scadute; è probabile che le tue chiavi non siano tutte della stessa dimensione, quindi si verifica la frammentazione della memoria interna.

Per impostazione predefinita, redis utilizza l'allocatore di memoria jemalloc , che fa del suo meglio per essere sia compatto che veloce, ma è un allocatore di memoria generico e non può tenere il passo con molte allocazioni e svuotamenti di oggetti che si verificano a un ritmo elevato. Per questo motivo, su alcuni modelli di carico il processo di redis può apparentemente perdere memoria a causa della frammentazione interna. Ad esempio, se si dispone di un server con 7 Gb RAM e si desidera utilizzare redis come cache LRU non persistente, è possibile che il processo di maxmemory con maxmemory impostato su 5Gb nel tempo utilizzi sempre più memoria, raggiungendo infine il limite di RAM totale fino a quando l'assassino esaurito non interferisce.

memcached è una soluzione migliore per lo scenario descritto sopra, in quanto gestisce la sua memoria in un modo completamente diverso. memcached alloca un grosso pezzo di memoria - tutto ciò di cui avrà sempre bisogno - e quindi gestisce questa memoria da sola, utilizzando il proprio allocatore di slab implementato. Inoltre, memcached tenta di mantenere bassa la frammentazione interna, poiché utilizza effettivamente l'algoritmo LRU per slab , quando gli sfratti di LRU vengono eseguiti tenendo conto della dimensione dell'oggetto.

Detto questo, memcached ha ancora una posizione di forza negli ambienti, in cui l'utilizzo della memoria deve essere applicato e / o prevedibile. Abbiamo provato a utilizzare l'ultima versione stabile redis (2.8.19) come una sostituzione memcached non persistente drop-in basata su LRU nel carico di lavoro di 10-15k op / s, e trapelava la memoria A LOT; lo stesso carico di lavoro stava bloccando le istanze di Amazon di ElastiCache in un giorno circa a causa delle stesse ragioni.





redis