Redis
 sql >> Database >  >> NoSQL >> Redis

Notifiche Redis:ottieni chiave e valore alla scadenza

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.