In generale, una cache è un componente software o hardware che contiene dati dalle richieste del client passate, in modo che i dati possano essere recuperati e serviti più velocemente per le richieste effettuate in futuro. Nella maggior parte dei casi, i sistemi di backend non sono così veloci come vorresti che fossero. La cache si trova tra il livello del database back -end e l'applicazione client, fornendo un rapido recupero dei dati e un tempo di risposta rapido.
Quando i dati richiesti sono disponibili nella cache Redis, i dati possono essere rivolti direttamente dalla cache Redis senza reindirizzare la richiesta al database primario, che viene chiamato cache HIT. D'altra parte, se i dati non sono disponibili nella cache di Redis, la richiesta deve raggiungere il database del backend originale per recuperare i dati come al solito, che è un mancato cache, ma le successive richieste serviranno dalla cache.
Con questo tipo di comportamento, la memorizzazione nella cache di Redis è una scelta eccellente per molti casi d'uso.
Le cache Redis offrono alla tua applicazione diversi vantaggi durante l'introduzione di una grande sfida, che si chiama Cache Stalness. Ad un certo punto, la tua cache potrebbe essere piena di dati stantii che non sono nemmeno validi per oggi. Quindi, dovrebbe esserci un meccanismo per sfrattare i dati vecchi o non validi mentre continui a utilizzare la cache Redis con nuovi dati.
Redis Cache Evazione
Quando Redis Cache è stata introdotta per la prima volta, gli sviluppatori utilizzavano il valore TTL (time-to-live) per ogni chiave per mantenere una quantità relativamente costante di memoria abbinando la velocità dei dati che entravano e uscivano dal sistema. Questo è stato un sacco di lavoro manuale per gli sviluppatori, il che è qualcosa che il server Redis dovrebbe gestire.
Quindi, l'approccio ideale dovrebbe essere quello di espellere automaticamente i vecchi dati quando viene raggiunto il limite di memoria massima della cache, che è anche il processo seguito dal sistema Memcached. Redis usa lo speciale maxmemory direttiva per notificare che è stato raggiunto il limite di memoria massimo.
Direttiva di configurazione MaxMemory
Redis utilizza la direttiva di configurazione MaxMemory per identificare la memoria massima disponibile per la cache su cui lavorare. Esistono due modi in cui è possibile impostare il valore della direttiva MaxMemory.
Quello che segue è un esempio di Redis.File conf che mostra come è possibile specificare la memoria massima cache per il set di dati. In questo caso, la direttiva MaxMemory è stata impostata su 1000 byte.
Allo stesso modo, il comando di set di configurazione Redis può essere utilizzato per impostare la direttiva MaxMemory in fase di esecuzione, come mostrato nel seguente.
config set maxmemory 100
Inoltre, se si imposta il valore della direttiva MAXMemory su 0, significa che non è stato specificato alcun limite di memoria per la cache Redis. Nella maggior parte dei sistemi a 64 bit, questo valore è impostato su 0. Il sistema a 32 bit utilizza implicitamente il limite di memoria massima da 3 GB.
Quando la cache Redis colpisce il valore di memoria specificato dalla direttiva MaxMemory, inizia a rimuovere le chiavi secondo la politica di sfratto selezionata. Se nessuna chiave soddisfa i criteri politici, allora non verrà sfrattato nulla. Invece, il server Redis risponderà con errori a comandi come Lpush e set che consuma più memoria e risponde solo ai comandi di sola lettura come GET.
Nella sezione seguente, discuteremo delle politiche di sfratto di Redis e di come determinano quali chiavi dovrebbero essere sfrattate o no.
Politiche di sfratto
Una politica di sfratto determina il comportamento della cache di Redis quando viene raggiunto il valore MaxMemory. Redis rimuoverà tutte le chiavi che soddisfano i criteri politici indicati in un determinato momento. Quindi, è importante assicurarsi di avere un database abbastanza grande per mantenere le chiavi desiderate. Le seguenti sezioni descrivono le diverse politiche di sfratto di Redis disponibili per l'uso.
Noeviction
Sono disponibili diverse politiche di sfratto e Noeviction è uno dei più utilizzati se non si desidera rimuovere i vecchi chiavi quando viene raggiunto il limite di memoria massimo. Tuttavia, lancerà errori su tutte le operazioni di scrittura Redis per avvisare l'utente che la cache è piena e libera un po 'di spazio. In breve, i dati non verranno salvati nella cache fino a quando non si libera manualmente un po 'di spazio.
volatile-ttl
Nel volatile-ttl Politica, Redis preleva campioni di chiavi i cui campi scaduti sono impostati su true e sfratta quelli con il valore TTL più piccolo. Se non ci sono chiavi con il campo scaduto impostato su true, allora non si verifica sfratto, che è simile a Noeviction politica.
volatile-random
Questa è un'altra versione della politica volatile-TTL in cui Redis rimuove casualmente le chiavi il cui campo scadenza è impostato su True. Ancora una volta, considera solo le chiavi che hanno un valore TTL ma non l'intero spazio chiave.
Allkeys-Random
Questo è più simile a volatile-random politica, ma con il Allkeys-Random Politica, verrà considerata l'intero spazio chiave, non solo le chiavi con un valore TTL. In questo caso, Redis sfratterà le chiavi in modo casuale per aggiungere nuovi dati.
Entrambe le politiche di cui sopra usano un algoritmo casuale per sfrattare le chiavi dalla cache, che è abbastanza rischioso e potrebbe non essere il modo ottimale per fare lo sfratto chiave. Quindi, Redis ha introdotto un modo più ottimale per farlo con il nuovo LRU (meno recentemente usato) algoritmo.
L'algoritmo LRU (meno recentemente utilizzato)
L'algoritmo LRU si basa sul presupposto che se è stata accessibile una determinata chiave di recente, esiste una maggiore probabilità di accedervi di nuovo nel prossimo futuro. D'altra parte, se non abbiamo usato una determinata chiave per molto tempo, c'è una maggiore possibilità che la chiave non venga usata presto o mai più. Con questo presupposto, l'algoritmo LRU cerca di sfrattare le chiavi meno recentemente usate dalla cache Redis, che è un approccio più ottimale rispetto agli algoritmi di sfratto a chiave casuale.
Per attuare questa politica, l'oggetto Redis utilizza un nuovo lru campo con 24 bit assegnati, che tiene traccia di quando la chiave è stata utilizzata l'ultima volta. Con l'algoritmo LRU in atto, richiede un numero specifico di chiavi casuali e sfratta quello con il tempo inattivo più alto o il più antico tempo di accesso. La direttiva MAXMemory-Samples viene utilizzata per specificare il numero di chiavi per campione. Questo può essere impostato utilizzando il comando set config, come mostrato nel seguente.
config set maxmemory-campioni 5
È importante tenere presente che Redis gestisce un'approssimazione dell'algoritmo LRU per mantenere le cose semplici e salvare risorse di calcolo come CPU e memoria.
Ci sono due gusti della politica di sfratto di LRU.
volatile-lru
Le chiavi meno usate di recente con il campo scaduto impostato su TRUE verranno rimossi. Le chiavi che non sono associate a un valore TTL non saranno sfrattate nell'ambito di questa politica perché il campione viene preso solo dalle chiavi il cui campo scade è impostato su True.
Allkeys-lru
Tutte le chiavi con il tempo inattivo più alto verranno rimosse. In questo caso, Redis manterrà le chiavi utilizzate più recentemente.
L'algoritmo LFU (meno frequentemente usato)
Redis ha introdotto il nuovo algoritmo LFU (meno frequentemente usato) nella versione 4.0 per identificare i tasti usati raramente e rimuoverle dalla cache quando viene raggiunto il limite di memoria massimo. Con la politica LFU, le chiavi a cui si accede troppo spesso rimarranno.
volatile-lfu
Le chiavi con i campi scaduti impostati su true e quelli che sono meno frequentemente utilizzati tra il campione selezionato saranno sfrattati.
Allkeys-lfu
Cerca l'intero spazio chiave per chiavi usate raramente e le elimina mantenendo le chiavi usate di frequente.
Conclusione
Per concludere, Redis utilizza la direttiva MaxMemory per specificare il limite di memoria massimo della cache Redis. Come discusso, quando la cache raggiunge il limite di memoria massimo, la politica di sfratto configurata spara e rimuoverà le chiavi. Redis usa le approssimazioni degli algoritmi LRU e LFU per trovare i migliori candidati per lo sfratto.