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 semplice Memorizzazione nella cache di frammenti HTML (o applicazioni simili). Se hai bisogno di memorizzare diversi campi dei tuoi oggetti in diverse chiavi memorizzate nella cache, gli hash Redis saranno più efficienti in termini di memoria, ma quando hai un numero elevato di coppie chiave -> stringa_semplice, memcached dovrebbe essere in grado di darti più elementi per megabyte.
Altri aspetti positivi di memcached:
- È un codice molto semplice, quindi se hai solo bisogno della funzionalità che fornisce, credo sia un'alternativa ragionevole, ma non l'ho mai usato 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 la memorizzazione nella cache intelligente o quando cercano di preservare la struttura dei dati memorizzati nella cache tramite le strutture di dati Redis.
Confronto tra Redis LRU e LRU memorizzato nella cache.
Sia memcached che Redis non eseguono veri e propri sfratti LRU, ma solo un'approssimazione di ciò.
Lo sfratto di Memcache è per classe di dimensione e dipende dai dettagli di implementazione del relativo allocatore di lastre. Ad esempio, se vuoi 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 taglia, che è il miglior candidato.
Redis cerca invece di scegliere un buon oggetto come candidato allo sfratto quando maxmemory
viene raggiunto il limite, guardando tutti gli oggetti, indipendentemente dalla classe di dimensione, ma è in grado di fornire solo un oggetto approssimativamente buono, non l'oggetto migliore con il maggiore tempo di inattività.
Il modo in cui Redis lo fa è campionare alcuni oggetti, selezionando quello che è stato inattivo (non accessibile) per il tempo più lungo. Da Redis 3.0 (attualmente in versione beta) l'algoritmo è stato migliorato e accetta anche pool di buoni candidati tra gli sfratti, quindi l'approssimazione è stata migliorata. Nella documentazione di Redis puoi trovare una descrizione e dei grafici con i dettagli su come funziona.
Perché memcached ha un footprint di memoria migliore rispetto a Redis per semplici mappe di stringhe -> stringhe.
Redis è un software più complesso, quindi i valori in Redis sono archiviati 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. Ciò rende la struttura interna di Redis buona e gestibile, ma ha un sovraccarico 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 per risparmiare memoria. Ad esempio, un piccolo Redis Hash 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.
In realtà puoi archiviare un oggetto in memcached come un singolo BLOB JSON (o codificato in binario), ma contrariamente a Redis, questo non ti consentirà di recuperare o aggiornare campi indipendenti.
Il vantaggio di Redis nel contesto della memorizzazione nella cache intelligente.
A causa delle strutture dati Redis, il solito schema usato con memcached per distruggere oggetti quando la cache viene invalidata, per ricrearla dal DB in un secondo momento, è 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ù recenti" del sito. Quello che fai con Redis è prendere un elenco (limitato a M elementi) con le ultime notizie inserite. Se utilizzi un altro archivio per i tuoi dati e Redis come cache, ciò che fai è compilare entrambi le visualizzazioni (Redis e il DB) quando viene pubblicato un nuovo elemento. Non c'è invalidamento della cache.
Tuttavia l'applicazione può sempre avere una logica in modo che se l'elenco Redis viene trovato vuoto, ad esempio dopo un avvio, la vista iniziale può essere ricreata dal DB.
Utilizzando la cache intelligente è possibile eseguire la memorizzazione nella cache con Redis in modo più efficiente rispetto a memcached, ma non tutti i problemi sono adatti a questo modello. Ad esempio, la memorizzazione nella cache dei frammenti HTML potrebbe non trarre vantaggio da questa tecnica.