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

Notificación de caducidad de clave en redis python

La sorpresa (no se ven eventos de caducidad cuando el tiempo de vida de una clave llega a cero) no está ligada a Python, sino a la forma en que Redis está caducando las claves.

Documento de Redis sobre el momento de los eventos vencidos

Tiempos de eventos vencidos

Redis vence las claves con un tiempo de vida asociado de dos maneras:

  • Cuando se accede a la clave mediante un comando y se descubre que ha caducado.
  • A través de un sistema en segundo plano que busca claves caducadas en segundo plano, de forma incremental, para poder recopilar también claves a las que nunca se accede.

Los eventos caducados se generan cuando se accede a una clave y uno de los sistemas anteriores determina que está caducada, como resultado, no hay garantías de que el servidor de Redis pueda generar el evento caducado en el momento en que la clave está activa. alcanza el valor de cero.

Si ningún comando apunta a la clave constantemente y hay muchas claves con un TTL asociado, puede haber una demora significativa entre el momento en que el tiempo de vida de la clave cae a cero y el momento en que se genera el evento caducado.

Básicamente, los eventos caducados se generan cuando el servidor de Redis elimina la clave y no cuando el tiempo de vida alcanza teóricamente el valor de cero.

Pequeña prueba en consola

cuando se ejecuta Redis ($ sudo service redis-server start )

Empecé una consola y me he suscrito:

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

Luego, en otra consola:

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

lo que se suscribirá a todo tipo de eventos

Luego continué con los experimentos en esta segunda consola:

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

Todas las actividades se vieron en la consola suscrita. Solo la caducidad de la clave se retrasó en algún momento unos segundos, en algún momento llegó justo a tiempo.

Tenga en cuenta también que hay diferencias sutiles en los mensajes, un mensaje [email protected]__:expire otro [email protected]__:expired .

Oyente de muestra spy.py

import redis
import time

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

Este código se registra en todos los canales existentes en Redis predeterminado e imprime todo lo que se publica.

Ejecutarlo:

$ python spy.py

y en otra consola intente configurar una clave con vencimiento. Verás todos los eventos.

Para seguir la entrada de 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

obtenemos salida espía:

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'}