O recurso ao qual Eli vinculou permite que você ouça quando uma chave expira. No entanto, ele não fornece o valor da chave. Além disso, com base no problema arquivado do github, não parece que você possa esperar que esse recurso seja incorporado em breve (https://github.com/antirez/redis/issues/1876). A solução que uso é criar uma chave de expiração "sombra" especial que está vinculada à chave onde você tem um valor real.
Então, digamos que você tenha uma chave chamada
testkey
e tem um valor inteiro de 100
. Além disso, a chave expirará após 10 segundos, momento em que você deseja obter o valor da chave. (Talvez você estivesse incrementando a chave durante os 10 segundos que ela existia). Primeiro você precisa configurar a escuta para eventos de keyspace. Em particular, você deseja ouvir
expired
eventos. Você pode fazer isso a partir de sua configuração ou usar o config set
comando em redis. (veja aqui para mais informações:http://redis.io/topics/notifications) CONFIG SET notify-keyspace-events Ex
Agora você pode se inscrever em um
keyevent
especial canal onde você será notificado de que a chave expirou. SUBSCRIBE [email protected]__:expired
O formato do canal para se inscrever é
[email protected]<db>__:<eventName>
. Em nosso exemplo, estamos assumindo que estamos trabalhando com o banco de dados padrão 0 e queremos ouvir o expired
evento. Quando a
testkey
expirar, você receberá uma mensagem no __keyevent__
canal onde a mensagem é o nome da chave que expirou. É claro que neste momento a chave se foi, então não podemos mais acessar o valor! A solução é usar uma chave de expiração especial. Quando você cria sua
testkey
também crie uma chave "sombra" especial que expira (não expire a testkey
real ). Por exemplo:SET testkey 100
SET shadowkey:testkey "" EX 10
Agora no
[email protected]__:expired
você receberá uma mensagem informando que a chave shadowkey:testkey
expirado. Pegue o valor da mensagem (que é o nome da chave), divida nos dois pontos (ou qualquer separador que você decida usar) e, em seguida, obtenha manualmente o valor da chave e exclua-o. // 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
Observe que o valor do shadowkey não é usado, portanto, você deseja usar o menor valor possível que, de acordo com esta resposta (chave de armazenamento do Redis sem valor) é uma string vazia
""
. É um pouco mais trabalhoso para configurar, mas o sistema acima faz exatamente o que você precisa. A sobrecarga são alguns comandos extras para realmente recuperar e excluir sua chave, além do custo de armazenamento de uma chave vazia.