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 maxmemory
viene 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.