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.