Se redis fa già parte dello stack, perché Memcached viene ancora utilizzato insieme a Redis?


85

Redis può fare tutto ciò che fornisce Memcached (cache LRU, scadenza degli elementi e ora il clustering nella versione 3.x +, attualmente in beta) o tramite strumenti come twemproxy. Anche le prestazioni sono simili. Inoltre, Redis aggiunge la persistenza grazie alla quale non è necessario eseguire il riscaldamento della cache in caso di riavvio del server.

Riferimento ad alcune vecchie risposte che mettono a confronto Redis e Memcache, alcune delle quali favoriscono Redis in sostituzione di Memcache (se già presente nello stack):

Nonostante ciò, studiando pile di grandi aziende su scala web come Instagram, Pinterest, Twitter ecc., Ho scoperto che usano sia Memcached che Redis per scopi diversi, non usando Redis per il caching primario. La cache primaria è ancora Memcached e Redis viene utilizzato per la memorizzazione logica nella cache basata sulle strutture dati.

A partire dal 2014, perché vale ancora la pena aggiungere memcached come componente aggiuntivo nel tuo stack, quando hai già un componente Redis che può fare tutto ciò che può fare memcached? Quali sono i punti favorevoli che spingono gli architetti / ingegneri a includere ancora memcached oltre ai Redis già esistenti?

Aggiornare :

Per le nostre piattaforme, abbiamo completamente scartato Memcached e usiamo redis per requisiti di caching sia semplici che logici. Altamente performante, flessibile e affidabile.

Alcuni scenari di esempio:

  • Elencare tutte le chiavi memorizzate nella cache in base a un modello specifico e leggere o eliminare i relativi valori. Molto facile in redis, non fattibile (facilmente) in memcached.
  • La memorizzazione di un carico utile superiore a 1 MB, facile da eseguire in redis, richiede modifiche alle dimensioni della lastra in memcached, che ha effetti collaterali sulle prestazioni.
  • Semplici istantanee del contenuto della cache corrente
  • Anche il cluster Redis è pronto per la produzione insieme ai driver della lingua, quindi anche la distribuzione in cluster è facile.

Risposte:


122

Il motivo principale che vedo oggi come un caso d'uso per memcached su Redis è l'efficienza della memoria superiore che dovresti essere in grado di ottenere con la semplice cache di frammenti HTML (o applicazioni simili). Se hai bisogno di memorizzare diversi campi dei tuoi oggetti in diverse chiavi memcached, allora gli hash Redis saranno più efficienti in termini di memoria, ma quando hai un gran numero di coppie di chiavi -> simple_string, memcached dovrebbe essere in grado di darti più elementi per megabyte.

Altre cose che sono buoni punti su memcached:

  • È un pezzo di codice molto semplice, quindi se hai solo bisogno delle funzionalità che fornisce, immagino sia un'alternativa ragionevole, ma non l'ho mai usata in produzione.
  • È multi-thread, quindi se devi ridimensionare in una configurazione a scatola singola, è una buona cosa e devi parlare con una sola istanza.

Credo che Redis come cache abbia sempre più senso quando le persone si spostano verso il caching intelligente o quando cercano di preservare la struttura dei dati memorizzati nella cache tramite le strutture dei dati Redis.

Confronto tra Redis LRU e memcached LRU.

Sia memcached che Redis non eseguono veri e propri sfratti LRU, ma solo un'approssimazione di ciò.

L'eliminazione di memcache è una classe per dimensione e dipende dai dettagli di implementazione del suo allocatore slab. Ad esempio, se desideri aggiungere un elemento che rientra in una determinata classe di dimensioni, memcached proverà a rimuovere gli elementi scaduti / non utilizzati di recente in quella classe, invece di provare un tentativo globale di capire qual è l'oggetto, indipendentemente dal suo dimensione, che è il miglior candidato.

Redis invece cerca di scegliere un buon oggetto come candidato allo sfratto quando maxmemoryviene raggiunto il limite, guardando tutti gli oggetti, indipendentemente dalla classe di taglia, ma è in grado di fornire solo un oggetto approssimativamente buono, non il miglior oggetto con il maggiore inattivo tempo.

Il modo in cui Redis lo fa è campionando alcuni oggetti, scegliendo quello che è stato inattivo (non accessibile) per il tempo più lungo. Da Redis 3.0 (attualmente in beta) l'algoritmo è stato migliorato e accetta anche un buon pool di candidati attraverso gli sfratti, quindi l'approssimazione è stata migliorata. Nella documentazione di Redis puoi trovare una descrizione e grafici con dettagli su come funziona .

Perché memcached ha un footprint di memoria migliore di Redis per semplici stringhe -> string map.

Redis è un software più complesso, quindi i valori in Redis sono memorizzati in un modo più simile agli oggetti in un linguaggio di programmazione di alto livello: hanno tipo associato, codifica, conteggio dei riferimenti per la gestione della memoria. Questo rende la struttura interna di Redis buona e gestibile, ma ha un overhead rispetto a memcached che si occupa solo di stringhe.

Quando Redis inizia a essere più efficiente in termini di memoria

Redis è in grado di memorizzare piccoli tipi di dati aggregati in un modo speciale di salvataggio della memoria. Ad esempio, un piccolo hash Redis che rappresenta un oggetto, viene archiviato internamente non con una tabella hash, ma come un BLOB binario univoco. Quindi impostare più campi per oggetto in un hash è più efficiente che memorizzare N chiavi separate in memcached.

Puoi, in realtà, memorizzare un oggetto in memcached come un singolo blob JSON (o con codifica binaria), ma contrariamente a Redis, ciò non ti consentirà di recuperare o aggiornare campi indipendenti.

Il vantaggio di Redis nel contesto del caching intelligente.

A causa delle strutture dati di Redis, il solito modello usato con memcached per distruggere oggetti quando la cache è invalidata, per ricrearla successivamente dal DB, è un modo primitivo di usare Redis.

Ad esempio, immagina di dover memorizzare nella cache le ultime N notizie pubblicate in Hacker News per popolare la sezione "Più recente" del sito. Quello che fai con Redis è prendere un elenco (limitato a M elementi) con le notizie più recenti inserite. Se utilizzi un altro negozio per i tuoi dati e Redis come cache, ciò che devi fare è popolare entrambe le visualizzazioni (Redis e DB) quando viene pubblicato un nuovo elemento. Non vi è alcuna invalidazione della cache.

Tuttavia l'applicazione può sempre avere una logica in modo che se l'elenco Redis risulta vuoto, ad esempio dopo un avvio, la visualizzazione iniziale può essere ricreata dal DB.

Utilizzando il caching intelligente è possibile eseguire il caching con Redis in modo più efficiente rispetto a memcached, ma non tutti i problemi sono adatti a questo pattern. Ad esempio, la memorizzazione nella cache dei frammenti HTML potrebbe non beneficiare di questa tecnica.


Grazie Antirez il creatore. Ma ** perché l'impronta di memoria di Redis per stringhe semplici è maggiore di quella di memcached? ** La compressione è un fattore? Oppure Redis memorizza altri dati extra quando un SET viene utilizzato per memorizzare una stringa semplice? Sarebbe fantastico se potessi includere queste informazioni nella risposta.
DhruvPathak

3
Ho provato a migliorare la risposta. Grazie per il feedback.
antirez

3
Un altro aspetto della suddetta "intelligenza", o sfruttamento dei tipi di dati di Redis e della logica lato server tramite operazioni e / o script, è che si risparmia sia sulla complessità dell'applicazione che sulla rete (come discusso da @antirez su antirez . com / news / 73 e Yiftach su redislabs.com/blog/the-proven-redis-performance ).
Itamar Haber

1
Grazie Antirez per la risposta. Un altro motivo potrebbe essere che memcached è solo un po 'più veloce. Inoltre è un vecchio software e molti framework lo supportano come impostazione predefinita
Nick

3
Ottima risposta, devo amare quanto sia dedicato il padre di Redis con la comunità.
Mahn

13

Le abitudini sono difficili da rompere :)

Seriamente, però, ci sono due ragioni principali - a quanto mi risulta - per cui Memcached è ancora utilizzato:

  1. Legacy: ci sono sviluppatori che hanno familiarità con Memcached, così come le applicazioni che lo supportano. Ciò significa anche che si tratta di una tecnologia matura e ben collaudata.
  2. Ridimensionamento - Memcached standard è facilmente scalabile orizzontalmente, mentre Redis (fino a ed escludendo la v3 di prossima uscita) richiede più lavoro a tal fine (cioè sharding).

Però:

  1. Ri. legacy - data la robustezza di Redis (strutture dati, comandi, persistenza ...), essendo attivamente sviluppato e client in ogni linguaggio immaginabile - le nuove applicazioni vengono solitamente sviluppate con esso.
  2. Ridimensionamento: oltre alla prossima v3, ci sono soluzioni che possono rendere il ridimensionamento molto più semplice. Ad esempio, Redis Cloud offre una scalabilità continua senza perdita di dati o interruzione del servizio. Un altro approccio popolare al ridimensionamento / partizionamento orizzontale di Redis è twemproxy .

1
Solo una nota: come confermato dall'attuale manutentore su Twitter, Memcached è ancora attivamente sviluppato / mantenuto. Immagino che il fatto che non aggiunga nuove cose spesso sia dovuto alla maturità raggiunta dal progetto e alla riluttanza ad aggiungere nuove cose, quindi i nuovi sviluppi si concentrano su ottimizzazioni / correzioni.
antirez

1
TIL that Memcached è ancora vivo e vegeto - modificato la mia risposta / ty antirez & dormando
Itamar Haber

1
L'hashing coerente è ancora un modello più affidabile per i normali errori rispetto allo sharding Redis per uno scenario di cache pura. Quando i nodi cadono, le chiavi della cache si spostano automaticamente su altri server. Finché hai un singolo server, la tua cache funziona ancora, al contrario di redis dove se perdi master e slave per qualsiasi hashgroup il tuo cluster fallisce.
Usman Ismail

1
RedisLabs è eccellente. È una tecnologia chiave dietro Userify Cloud.
fatal_error

1
Sono anche estremamente sospettoso di qualsiasi implementazione che non sia multi-thread e basata su loop di eventi. ... OK, ora dove sono gli attuali apologeti delle prestazioni, ho preparato la loro cena. Ora Redis potrebbe farlo, e io sarei molto più pro-Redis dal lato del sistema. A questo punto, però, a meno che il gruppo di sviluppo non sia insolitamente capace di memorizzare nella cache, memcached è un'implementazione semplice e più efficiente ... le funzionalità non sono MAI gratuite, non lasciare che gli apologeti ti dica che lo sono o che i tuoi costi sono insignificanti.
JM Becker
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.