La funzione a cui Eli si è collegato ti consente di ascoltare quando una chiave scade. Tuttavia, non ti dà il valore della chiave. Inoltre, in base al problema archiviato con github, non sembra che tu possa aspettarti di avere questa funzione integrata in qualsiasi momento, se mai (https://github.com/antirez/redis/issues/1876). La soluzione che utilizzo è creare una chiave di scadenza "ombra" speciale collegata alla chiave in cui hai un valore effettivo.
Quindi supponiamo che tu abbia una chiave chiamata testkey
e ha un valore intero di 100
. Inoltre, la chiave scadrà dopo 10 secondi, a quel punto si desidera ottenere il valore della chiave. (Forse stavi incrementando la chiave durante i 10 secondi in cui è esistita).
Per prima cosa devi configurare l'ascolto per gli eventi keyspace. In particolare vuoi ascoltare expired
eventi. Puoi farlo dalla tua configurazione o usare il config set
comando in redis. (vedi qui per maggiori informazioni:http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Ora puoi iscriverti a uno speciale keyevent
canale in cui ti verrà comunicato che la chiave è scaduta.
SUBSCRIBE [email protected]__:expired
Il formato del canale a cui iscriversi è [email protected]<db>__:<eventName>
. Nel nostro esempio stiamo assumendo che stiamo lavorando con il database predefinito 0 e vogliamo ascoltare il expired
evento.
Quando il testkey
scade ora riceverai un messaggio nel __keyevent__
canale dove il messaggio è il nome della chiave scaduta. Ovviamente a questo punto la chiave è sparita quindi non possiamo più accedere al valore! La soluzione è utilizzare una chiave di scadenza speciale.
Quando crei il tuo testkey
crea anche una speciale chiave "ombra" in scadenza (non far scadere l'attuale testkey
). Ad esempio:
SET testkey 100
SET shadowkey:testkey "" EX 10
Ora nel [email protected]__:expired
canale riceverai un messaggio che ti dice che la chiave shadowkey:testkey
è scaduto. Prendi il valore del messaggio (che è il nome della chiave), dividilo sui due punti (o qualsiasi altro separatore tu decida di utilizzare), quindi ottieni manualmente il valore della chiave ed eliminalo.
// set your key value
SET testkey 100
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:testkey "" EX 10
// Get an expiration message in the channel [email protected]__:expired
// Split the key on ":", take the second part to get your original key
// Then get the value and do whatever with it
GET testkey
// Then delete the key
DEL testkey
Nota che il valore della shadowkey non viene utilizzato, quindi desideri utilizzare il valore più piccolo possibile che secondo questa risposta (chiave di archiviazione Redis senza valore) è una stringa vuota ""
. È un po 'più di lavoro da configurare, ma il sistema sopra fa esattamente ciò di cui hai bisogno. Il sovraccarico è costituito da alcuni comandi aggiuntivi per recuperare ed eliminare effettivamente la chiave più il costo di archiviazione di una chiave vuota.