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

Redis-meddelelser:Få nøgle og værdi ved udløb

Funktionen, som Eli linkede til, giver dig mulighed for at lytte, når en nøgle udløber. Det giver dig dog ikke værdien af ​​nøglen. Baseret på det indleverede github-problem ser det desuden ikke ud til, at du kan forvente at få denne funktion indbygget når som helst snart eller nogensinde (https://github.com/antirez/redis/issues/1876). Løsningen jeg bruger er at skabe en speciel "skygge" udløbsnøgle, der er knyttet til nøglen, hvor du har en faktisk værdi.

Så lad os sige, at du har en nøgle kaldet testkey og den har en heltalsværdi på 100 . Ydermere vil nøglen udløbe efter 10 sekunder, hvorefter du ønsker at få nøglens værdi. (Måske øgede du nøglen i løbet af de 10 sekunder, den eksisterede).

Først skal du konfigurere lytning til keyspace-begivenheder. Især vil du lytte efter expired begivenheder. Du kan gøre dette fra din config eller bruge config set kommando i redis. (se her for mere info:http://redis.io/topics/notifications)

CONFIG SET notify-keyspace-events Ex

Nu kan du abonnere på en særlig keyevent kanal, hvor du får besked om, at nøglen er udløbet.

SUBSCRIBE [email protected]__:expired

Formatet på den kanal, der skal abonneres på, er [email protected]<db>__:<eventName> . I vores eksempel antager vi, at vi arbejder med standarddatabasen 0, og vi vil lytte efter den expired begivenhed.

Når testkey udløber vil du nu få en besked i __keyevent__ kanal, hvor beskeden er navnet på den nøgle, der er udløbet. Naturligvis på dette tidspunkt er nøglen væk, så vi kan ikke længere få adgang til værdien! Løsningen er at bruge en speciel udløbsnøgle.

Når du opretter din testkey også oprette en speciel udløbende "skygge" nøgle (udløb ikke den faktiske testkey ). For eksempel:

SET testkey 100
SET shadowkey:testkey "" EX 10

Nu i [email protected]__:expired kanal vil du få en besked, der fortæller dig, at nøglen shadowkey:testkey udløbet. Tag værdien af ​​meddelelsen (som er navnet på nøglen), opdel på kolon (eller hvilken separator du vælger at bruge), og få derefter manuelt nøglens værdi og slet den.

// set your key value
SET testkey 100 
//set your "shadow" key, note the value here is irrelevant
SET shadowkey:testkey "" EX 10 
// Get an expiration message in the channel [email protected]__:expired
// Split the key on ":", take the second part to get your original key
// Then get the value and do whatever with it
GET testkey
// Then delete the key
DEL testkey

Bemærk, at værdien af ​​shadowkey ikke bruges, så du vil bruge den mindst mulige værdi, som ifølge dette svar (Redis store nøgle uden værdi) er en tom streng "" . Det er lidt mere arbejde at konfigurere, men ovenstående system gør præcis, hvad du har brug for. Overheaden er et par ekstra kommandoer til rent faktisk at hente og slette din nøgle plus lageromkostningerne for en tom nøgle.



  1. Hvordan får man Redis til at køre på Azure?

  2. Hvordan opretter man Mongoose-skema med en række objekt-id'er?

  3. Hvad er NameNode Automatic Failover i Hadoop HDFS?

  4. Find og tæl elementer i samlingen med Mongoose