sql >> Database teknologi >  >> NoSQL >> Redis

Meddelelse om nøgleudløb i redis python

Overraskelsen (der ses ingen udløbsbegivenheder, når tiden til at leve for en nøgle når nul) er ikke bundet til Python, men snarere til måden, Redis udløber nøgler på.

Redis doc on Timing af udløbne hændelser

Timing af udløbne hændelser

Nøgler, der er knyttet til en tid til at leve, udløber af Redis på to måder:

  • Når nøglen tilgås af en kommando og viser sig at være udløbet.
  • Via et baggrundssystem, der søger efter udløbne nøgler i baggrunden, trinvist, for også at kunne indsamle nøgler, der aldrig er tilgået.

De udløbne hændelser genereres, når der tilgås en nøgle, og den viser sig at være udløbet af et af ovenstående systemer, som følge heraf er der ingen garantier for, at Redis-serveren vil være i stand til at generere den udløbne hændelse på det tidspunkt, hvor nøglen skal leve når værdien nul.

Hvis ingen kommando retter sig mod nøglen konstant, og der er mange nøgler med en TTL tilknyttet, kan der være en betydelig forsinkelse mellem det tidspunkt, hvor nøgletiden til live falder til nul, og det tidspunkt, hvor den udløbne hændelse genereres.

Dybest set udløbne hændelser genereres, når Redis-serveren sletter nøglen og ikke når tiden til at leve teoretisk når værdien nul.

Lille test på konsol

når Redis kører ($ sudo service redis-server start )

Jeg startede en konsol og har abonneret:

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

Derefter i en anden konsol:

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

hvad skal abonnere på alle slags begivenheder

Så fortsatte jeg med eksperimenter i denne anden konsol:

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

Alle aktiviteterne blev set i den abonnerede konsol. Kun nøgleudløbet var nogle gange et par sekunder forsinket, engang kom lige i tide.

Bemærk også, at der er små forskelle i beskeder, én besked [email protected]__:expire endnu et [email protected]__:expired .

Eksempel på lytter spy.py

import redis
import time

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

Denne kode registrerer til alle eksisterende kanaler i standard redis og udskriver det, der bliver offentliggjort.

Kør det:

$ python spy.py

og prøv i en anden konsol at indstille en nøgle med en udløbsdato. Du vil se alle begivenhederne.

Til følgende redis-cli input.

$ 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 spionoutput:

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. Gruppér resultat efter 15 minutters tidsinterval i MongoDb

  2. Spring Boot og hvordan konfigureres forbindelsesdetaljer til MongoDB?

  3. MongoDB:Får ikke korrekt resultat ved hjælp af $geoWithin-operatoren

  4. BsonSerializationException ved serialisering af en ordbog<DateTime,T> til BSON