Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Notificações do Redis:obtenha a chave e o valor na expiração


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.