Notification d'expiration de la clé dans le redis python
J'aimerais être averti lorsqu'un volatile clé expire dans mon redis magasin. Le redis site web fournit une description de la façon dont cela pourrait être réalisé dans http://redis.io/topics/notifications, mais je me demande si cela peut être fait en utilisant le python redis api.
Après réglage:notify-keyspace-events Ex
dans mon redis.fichier conf
et de l'exécution de cette comme un test:
import redis
import config
client = redis.StrictRedis.from_url(config.REDIS_URI)
client.set_response_callback('EXPIRE',callback)
client.set('a', 1)
client.expire('a',5)
callback()
seulement qui est appelé lorsque le client.expire('a',5)
est appelée, mais pas cinq secondes plus tard, comme prévu
Vous devez vous connecter pour publier un commentaire.
La surprise (pas d'expiration des événements lorsque le temps de vivre pour l'un des principaux atteint zéro) n'est pas lié à Python, mais plutôt à la façon dont, Redis de l'expiration de touches.
Redis doc sur le Calendrier des événements passés
Calendrier des événements passés
Touches avec une durée de vie associées sont expirés par le Redis de deux façons:
L'expiration des événements sont générés lorsqu'une touche est accessible et se trouve à être dépassée par l'un des systèmes ci-dessus, en conséquence, rien ne garantit que le Redis serveur sera en mesure de générer de l'expiration de l'événement au moment où la touche temps de vivre atteint la valeur zéro.
Si aucune commande n'objectifs de la clé en permanence, et il y a beaucoup de clés avec une durée de vie associées, il peut y avoir un délai important entre le moment où la clé de la durée de vie tombe à zéro, et le temps de l'expiration de l'événement est généré.
Fondamentalement expiration des événements sont générés lorsque le Redis serveur supprime la clé et non pas lorsque le temps de vivre théoriquement atteint la valeur zéro.
Petit test sur console
quand Redis en cours d'exécution (
$ sudo service redis-server start
)J'ai commencé une console et avoir souscrit:
Puis, dans une autre console:
ce qui est de s'abonner à des événements de toutes sortes
Puis j'ai continué avec des expériences dans ce deuxième console:
Toutes les activités ont été vus dans les abonnés de la console. Seule la clé de l'expiration a été parfois quelques secondes de retard, à un certain moment est venu juste à temps.
Note alse, il y a de subtiles différences dans les messages, un message
__keyevent@0__:expire
un autre__keyevent@0__:expired
.Échantillon auditeur
spy.py
Ce code enregistre à tous les canaux existants en défaut et redis imprime tout ce que soit publié.
De l'exécuter:
et dans une autre console, essayez de définir une clé avec une date d'expiration. Vous verrez tous les événements.
Pour la suite de redis-cli d'entrée.
nous obtenons spy de sortie: