Poiché stai utilizzando una cache, devi tollerare il problema dell'incoerenza dei dati , ovvero a un certo punto, i dati nella cache sono diversi dai dati nel database.
Non è necessario aggiornare il valore nella cache ogni volta che il valore è stato modificato. Altrimenti, l'intero sistema di cache sarà molto complicato (ad es. devi mantenere un elenco di chiavi che sono state memorizzate nella cache) e potrebbe anche non essere necessario farlo (ad es. il valore-chiave potrebbe essere utilizzato solo una volta e non è necessario per aggiornarlo ulteriormente).
Come possiamo aggiornare i dati nella cache e mantenere semplice il sistema della cache?
Normalmente, oltre a impostare o aggiornare una coppia chiave-valore nella cache, impostamo anche un TIMEOUT
per ogni chiave . Successivamente, il client può ottenere la coppia chiave-valore dalla cache. Tuttavia, se una chiave raggiunge il timeout, il sistema cache rimuove la coppia chiave-valore dalla cache. Questo si chiama THE KEY HAS BEEN EXPIRED
. La prossima volta, il client che tenta di ottenere quella chiave dalla cache, non riceverà nulla. Questo si chiama CACHE MISS
. In questo caso, il client deve ottenere la coppia chiave-valore dal database e aggiornarla nella cache con un nuovo timeout.
Se i dati sono stati aggiornati nel database, mentre la chiave NON è scaduta nella cache, il client riceverà dati incoerenti. Tuttavia, quando la chiave è scaduta, il suo valore verrà recuperato dal database e inserito nella cache da alcuni client. Successivamente, gli altri client riceveranno i dati aggiornati fino a quando i dati non saranno stati modificati di nuovo.
Come impostare il timeout?
Normalmente, ci sono due tipi di criteri di scadenza:
- Scade tra
N
secondi/minuti/ore... - Scade in un momento futuro, ad es. scadono al 30/7/2017 00:00:00
Un timeout di grandi dimensioni può ridurre ampiamente il carico del database, mentre i dati potrebbero non essere aggiornati per molto tempo. Un piccolo timeout può mantenere i dati aggiornati il più possibile, mentre il database avrà un carico pesante. Quindi devi bilanciare il compromesso durante la progettazione del timeout .
In che modo Redis fa scadere le chiavi?
Redis ha due modi per far scadere le chiavi:
- Quando il client tenta di operare su una chiave, Redis controlla se la chiave ha raggiunto il timeout. In tal caso, Redis rimuove la chiave e si comporta come se la chiave non esistesse. In questo modo, Redis garantisce che il cliente non riceva dati scaduti.
- Redis ha anche un thread di scadenza che campiona le chiavi a una frequenza configurata. Se le chiavi raggiungono il timeout, Redis rimuove queste chiavi. In questo modo, Redis può accelerare il processo di scadenza delle chiavi.