sql >> Base de Datos >  >> NoSQL >> Redis

Notificaciones de Redis:obtenga la clave y el valor al vencimiento

La función a la que Eli se vinculó le permite escuchar cuando caduca una clave. Sin embargo, no le da el valor de la clave. Además, según el problema de github presentado, no parece que pueda esperar tener esta función integrada en el corto plazo (https://github.com/antirez/redis/issues/1876). La solución que uso es crear una clave de caducidad "sombra" especial que está vinculada a la clave donde tiene un valor real.

Entonces, digamos que tiene una clave llamada testkey y tiene un valor entero de 100 . Además, la clave caducará después de 10 segundos, momento en el que desea obtener el valor de la clave. (Tal vez estuvo incrementando la clave durante los 10 segundos que existió).

Primero debe configurar la escucha de eventos de espacio de teclas. En particular, desea escuchar expired eventos. Puede hacer esto desde su configuración o usar el config set comando en redis. (consulte aquí para obtener más información:http://redis.io/topics/notifications)

CONFIG SET notify-keyspace-events Ex

Ahora puedes suscribirte a un keyevent especial canal donde se le notificará que la clave caducó.

SUBSCRIBE [email protected]__:expired

El formato del canal al que suscribirse es [email protected]<db>__:<eventName> . En nuestro ejemplo, asumimos que estamos trabajando con la base de datos predeterminada 0 y queremos escuchar el expired evento.

Cuando la testkey expira, ahora recibirá un mensaje en el __keyevent__ canal donde el mensaje es el nombre de la clave que caducó. Por supuesto, en este punto, la clave ya no está, ¡así que ya no podemos acceder al valor! La solución es utilizar una clave de caducidad especial.

Cuando creas tu testkey también cree una clave "sombra" especial que expira (no caduque la testkey real ). Por ejemplo:

SET testkey 100
SET shadowkey:testkey "" EX 10

Ahora en [email protected]__:expired canal, recibirá un mensaje que le indicará que la clave shadowkey:testkey Caducado. Tome el valor del mensaje (que es el nombre de la clave), divídalo por los dos puntos (o cualquier separador que decida usar), y luego obtenga manualmente el valor de la clave y elimínelo.

// 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

Tenga en cuenta que el valor de shadowkey no se usa, por lo que desea usar el valor más pequeño posible que, según esta respuesta (clave de almacenamiento de Redis sin valor) es una cadena vacía "" . Es un poco más de trabajo configurarlo, pero el sistema anterior hace exactamente lo que necesita. La sobrecarga son algunos comandos adicionales para recuperar y eliminar su clave más el costo de almacenamiento de una clave vacía.