Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Benachrichtigung über Schlüsselablauf in Redis Python

Die Überraschung (es werden keine Ablaufereignisse angezeigt, wenn die Lebensdauer eines Schlüssels Null erreicht) ist nicht an Python gebunden, sondern eher an die Art und Weise, wie Redis Schlüssel ablaufen lässt.

Redis-Dokumentation zum Timing abgelaufener Ereignisse

Timing abgelaufener Ereignisse

Schlüssel, denen eine Gültigkeitsdauer zugeordnet ist, werden von Redis auf zwei Arten verfallen:

  • Wenn durch einen Befehl auf den Schlüssel zugegriffen wird und festgestellt wird, dass er abgelaufen ist.
  • Über ein Hintergrundsystem, das im Hintergrund schrittweise nach abgelaufenen Schlüsseln sucht, um auch Schlüssel sammeln zu können, auf die nie zugegriffen wird.

Die abgelaufenen Ereignisse werden generiert, wenn auf einen Schlüssel zugegriffen wird und von einem der oben genannten Systeme festgestellt wird, dass er abgelaufen ist. Daher gibt es keine Garantie dafür, dass der Redis-Server das abgelaufene Ereignis zum Zeitpunkt der Gültigkeitsdauer des Schlüssels generieren kann den Wert Null erreicht.

Wenn kein Befehl ständig auf den Schlüssel abzielt und es viele Schlüssel mit einer zugeordneten TTL gibt, kann es zu einer erheblichen Verzögerung zwischen dem Zeitpunkt, an dem die Gültigkeitsdauer des Schlüssels auf null fällt, und dem Zeitpunkt, an dem das abgelaufene Ereignis generiert wird, kommen.

Grundsätzlich werden abgelaufene Ereignisse generiert, wenn der Redis-Server den Schlüssel löscht und nicht, wenn die Lebenserwartung theoretisch den Wert Null erreicht.

Kleiner Test auf der Konsole

wenn Redis läuft ($ sudo service redis-server start )

Ich habe eine Konsole gestartet und abonniert:

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

Dann in einer anderen Konsole:

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

was soll alle Arten von Veranstaltungen abonnieren

Dann fuhr ich mit Experimenten in dieser zweiten Konsole fort:

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

Alle Aktivitäten wurden in der abonnierten Konsole angezeigt. Nur der Ablauf des Schlüssels verzögerte sich manchmal um wenige Sekunden, manchmal kam er gerade noch rechtzeitig.

Beachten Sie auch, dass es geringfügige Unterschiede in den Nachrichten gibt, eine Nachricht [email protected]__:expire ein weiteres [email protected]__:expired .

Beispiel-Listener spy.py

import redis
import time

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

Dieser Code registriert sich in allen vorhandenen Kanälen in Standard-Redis und druckt alles, was veröffentlicht wird.

Führen Sie es aus:

$ python spy.py

und versuchen Sie in einer anderen Konsole, einen Schlüssel mit einem Ablaufdatum festzulegen. Sie sehen alle Ereignisse.

Für die folgende redis-cli-Eingabe.

$ 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

wir erhalten eine Spionageausgabe:

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