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

Notification d'expiration de clé dans redis python

La surprise (aucun événement d'expiration observé lorsque la durée de vie d'une clé atteint zéro) n'est pas liée à Python, mais plutôt à la façon dont Redis expire les clés.

Doc Redis sur la synchronisation des événements expirés

Horaire des événements expirés

Les clés associées à une durée de vie sont expirées par Redis de deux manières :

  • Lorsque la clé est accessible par une commande et qu'elle a expiré.
  • Via un système en arrière-plan qui recherche les clés expirées en arrière-plan, de manière incrémentielle, afin de pouvoir également collecter les clés qui ne sont jamais consultées.

Les événements expirés sont générés lorsqu'une clé est accédée et s'avère expirée par l'un des systèmes ci-dessus, par conséquent, il n'y a aucune garantie que le serveur Redis sera en mesure de générer l'événement expiré au moment de la durée de vie de la clé. atteint la valeur de zéro.

Si aucune commande ne cible constamment la clé et qu'il existe de nombreuses clés associées à un TTL, il peut y avoir un délai important entre le moment où la durée de vie de la clé tombe à zéro et le moment où l'événement expiré est généré.

En gros, les événements expirés sont générés lorsque le serveur Redis supprime la clé et non lorsque le temps à vivre atteint théoriquement la valeur de zéro.

Petit test sur console

lors de l'exécution de Redis ($ sudo service redis-server start )

J'ai démarré une console et je me suis abonné :

$ redis-cli
PSUBSCRIBE "__key*__:*"

Puis, dans une autre console :

$ redis-cli
> config set notify-keyspace-events AKE

ce qui doit s'inscrire à toutes sortes d'événements

Puis j'ai continué avec des expériences dans cette seconde console :

> set aaa aaa
> del aaa
> set aaa ex 5
> get aaa

Toutes les activités ont été vues dans la console abonnée. Seule l'expiration de la clé était parfois retardée de quelques secondes, parfois juste à temps.

Notez également qu'il existe des différences subtiles dans les messages, un message [email protected]__:expire un autre [email protected]__:expired .

Exemple d'écouteur spy.py

import redis
import time

r = redis.StrictRedis()
pubsub = r.pubsub()
pubsub.psubscribe("*")
for msg in pubsub.listen():
    print time.time(), msg

Ce code s'enregistre sur tous les canaux existants dans redis par défaut et imprime tout ce qui est publié.

Exécutez-le :

$ python spy.py

et dans une autre console, essayez de définir une clé avec une expiration. Vous verrez tous les événements.

Pour suivre l'entrée redis-cli.

$ redis-cli
127.0.0.1:6379> set a aha
OK
127.0.0.1:6379> set b bebe ex 3
OK
127.0.0.1:6379> set b bebe ex 3
OK

nous obtenons une sortie d'espion :

1401548400.27 {'pattern': None, 'type': 'psubscribe', 'channel': '*', 'data': 1L}
1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:a', 'data': 'set'}
1401548428.36 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'a'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'set'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'b'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expire'}
1401548436.8 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expire', 'data': 'b'}
1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expired'}
1401548439.82 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expired', 'data': 'b'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'set'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:set', 'data': 'b'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expire'}
1401548484.46 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expire', 'data': 'b'}
1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:b', 'data': 'expired'}
1401548487.51 {'pattern': '*', 'type': 'pmessage', 'channel': '[email protected]__:expired', 'data': 'b'}