La funzione collegata a Eli consente di ascoltare quando scade una chiave. Tuttavia, non ti dà il valore della chiave. Inoltre, in base al problema del github archiviato, non sembra che ci si possa aspettare che questa funzione venga creata in qualsiasi momento, se possibile (https://github.com/antirez/redis/issues/1876). La soluzione che utilizzo è creare una speciale chiave di scadenza "shadow" collegata alla chiave in cui si ha un valore reale.
Quindi diciamo che avete 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 che esisteva).
Per prima cosa è necessario impostare l'ascolto per gli eventi dello spazio delle chiavi.In particolare, si desidera ascoltare gli eventi expired
. Puoi farlo dalla tua configurazione o usare il comando config set
in redis. (Vedi qui per ulteriori informazioni: http://redis.io/topics/notifications)
CONFIG SET notify-keyspace-events Ex
Ora è possibile iscriversi a una speciale keyevent
canale in cui vi verrà notificato che la chiave è scaduto.
SUBSCRIBE [email protected]__:expired
Il formato del canale di sottoscrivere è [email protected]<db>__:<eventName>
. Nel nostro esempio stiamo assumendo che stiamo lavorando con il database predefinito 0 e vogliamo ascoltare l'evento expired
.
Quando lo testkey
scade, verrà visualizzato un messaggio nel canale __keyevent__
in cui il messaggio è il nome della chiave scaduta. Ovviamente a questo punto la chiave è sparita quindi non possiamo più accedere al valore! La soluzione è usare una chiave di scadenza speciale.
Quando si crea il testkey
, creare anche una speciale chiave "shadow" in scadenza (non scadere l'attuale testkey
). Per esempio:
SET testkey 100
SET shadowkey:testkey "" EX 10
Ora nel canale [email protected]__:expired
si otterrà un messaggio che indica che la chiave shadowkey:testkey
scaduto. Prendi il valore del messaggio (che è il nome della chiave), dividi i due punti (o qualsiasi altro separatore che decidi di usare), quindi ottieni manualmente il valore della chiave e cancellalo.
// 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
Si noti che il valore del Shadowkey non viene utilizzato in modo che si desidera utilizzare il valore più piccolo possibile che secondo questa risposta (Redis store key without a value) è una stringa vuota ""
. È un po 'più di lavoro da configurare, ma il sistema di cui sopra fa esattamente ciò di cui hai bisogno. Il sovraccarico è un paio di comandi extra per recuperare ed eliminare effettivamente la tua chiave più il costo di archiviazione di una chiave vuota.
Redis 2.8 è ancora un candidato di rilascio finora. Se hai bisogno di controllo sulle notifiche di scadenza delle chiavi, probabilmente sarebbe meglio implementarle esplicitamente (senza alcuna dipendenza da 2.8). Vedi http://stackoverflow.com/questions/11810020/how-to-handle-session-expire-basing-redis/11815594#11815594 –
Bene che 2.8 è ancora RC non è il problema. Il problema è che Redis pubblica eventi con la chiave, anziché il valore della voce. E poiché abbiamo bisogno di questo comportamento per tutte le notifiche, anche 2.6. quelli, abbiamo bisogno di un modo per dire a Redis di darci l'intero oggetto nel momento in cui è stato attivato l'evento, invece della chiave. –
Vorrei ancora usare una soluzione basata su zset –