Redis
 sql >> Base de données >  >> NoSQL >> Redis

Notifications Redis :obtenir la clé et la valeur à l'expiration

La fonctionnalité à laquelle Eli est lié vous permet d'écouter lorsqu'une clé expire. Cependant, il ne vous donne pas la valeur de la clé. De plus, sur la base du problème github déposé, il ne semble pas que vous puissiez vous attendre à ce que cette fonctionnalité soit intégrée de sitôt, voire jamais (https://github.com/antirez/redis/issues/1876). La solution que j'utilise est de créer une clé d'expiration "fantôme" spéciale qui est liée à la clé où vous avez une valeur réelle.

Disons donc que vous avez une clé appelée testkey et il a une valeur entière de 100 . De plus, la clé expirera après 10 secondes, moment auquel vous souhaitez obtenir la valeur de la clé. (Peut-être avez-vous incrémenté la clé pendant les 10 secondes qu'elle a existé).

Vous devez d'abord configurer l'écoute des événements keyspace. En particulier, vous voulez écouter expired événements. Vous pouvez le faire à partir de votre configuration ou utiliser le config set commande dans redis. (voir ici pour plus d'informations :http://redis.io/topics/notifications)

CONFIG SET notify-keyspace-events Ex

Vous pouvez maintenant vous abonner à un keyevent spécial canal où vous serez averti que la clé a expiré.

SUBSCRIBE [email protected]__:expired

Le format du canal auquel s'abonner est [email protected]<db>__:<eventName> . Dans notre exemple, nous supposons que nous travaillons avec la base de données par défaut 0 et que nous voulons écouter le expired événement.

Lorsque la testkey expire, vous recevrez maintenant un message dans le __keyevent__ canal où le message est le nom de la clé qui a expiré. Bien sûr, à ce stade, la clé a disparu, nous ne pouvons donc plus accéder à la valeur ! La solution consiste à utiliser une clé d'expiration spéciale.

Lorsque vous créez votre testkey créez également une clé "fantôme" spéciale expirant (n'expirez pas la testkey réelle ). Par exemple :

SET testkey 100
SET shadowkey:testkey "" EX 10

Maintenant dans le [email protected]__:expired canal, vous recevrez un message vous indiquant que la clé shadowkey:testkey expiré. Prenez la valeur du message (qui est le nom de la clé), divisez-la sur les deux-points (ou tout autre séparateur que vous décidez d'utiliser), puis récupérez manuellement la valeur de la clé et supprimez-la.

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

Notez que la valeur de la shadowkey n'est pas utilisée, vous souhaitez donc utiliser la plus petite valeur possible qui, selon cette réponse (clé de magasin Redis sans valeur) est une chaîne vide "" . C'est un peu plus de travail à configurer, mais le système ci-dessus fait exactement ce dont vous avez besoin. La surcharge correspond à quelques commandes supplémentaires pour récupérer et supprimer votre clé, ainsi qu'au coût de stockage d'une clé vide.