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:https://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 example@sqldat.com__:expired
O formato do canal para se inscrever é
example@sqldat.com<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
example@sqldat.com__: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 example@sqldat.com__: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.