sql >> Databasteknik >  >> NoSQL >> Redis

Meddelande om nyckelns utgång i redis python

Överraskningen (inga utgångshändelser ses när tiden att leva för en nyckel når noll) är inte bunden till Python, utan snarare till sättet att Redis löper ut nycklar.

Redis doc on Timing of utgångna händelser

Tidpunkt för utgångna händelser

Nycklar med en associerad tid att leva förfaller av Redis på två sätt:

  • När nyckeln nås av ett kommando och visar sig vara utgången.
  • Via ett bakgrundssystem som letar efter utgångna nycklar i bakgrunden, stegvis, för att även kunna samla in nycklar som aldrig nås.

De utgångna händelserna genereras när en nyckel nås och visar sig vara utgången av något av ovanstående system, som ett resultat av det finns inga garantier för att Redis-servern kommer att kunna generera den utgångna händelsen vid den tidpunkt då nyckeltiden ska leva når värdet noll.

Om inget kommando riktar in sig på nyckeln konstant, och det finns många nycklar med en TTL associerad, kan det uppstå en betydande fördröjning mellan den tidpunkt då nyckeltiden för att leva sjunker till noll och den tidpunkt då den förfallna händelsen genereras.

I princip utgångna händelser genereras när Redis-servern tar bort nyckeln och inte när tiden att leva teoretiskt når värdet noll.

Lite test på konsolen

när Redis körs ($ sudo service redis-server start )

Jag startade en konsol och har prenumererat:

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

Sedan, i en annan konsol:

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

vad ska prenumerera på alla typer av evenemang

Sedan fortsatte jag med experiment i denna andra konsol:

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

Alla aktiviteter sågs i den prenumererade konsolen. Bara nyckelns utgång var någon gång några sekunder försenad, någon gång kom precis i tid.

Observera också att det finns subtila skillnader i meddelanden, ett meddelande [email protected]__:expire ett annat [email protected]__:expired .

Exempel på lyssnare spy.py

import redis
import time

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

Den här koden registreras för alla befintliga kanaler i standardredis och skriver ut allt som publiceras.

Kör det:

$ python spy.py

och försök i en annan konsol att ställa in en nyckel med utgångsdatum. Du kommer att se alla händelser.

För följande redis-cli-ingång.

$ 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

vi får spionutdata:

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



  1. Redis värdeuppdatering

  2. Fråga inbäddade objekt i Mongoid/rails 3 (Lägre än, Min-operatorer och sortering)

  3. Publicera prenumerera med nodejs och redis(node_redis)

  4. MongoDB $asinh