sql >> Databasteknik >  >> NoSQL >> Redis

Redis-aviseringar:Få nyckel och värde vid utgång

Funktionen som Eli länkade till låter dig lyssna när en nyckel går ut. Det ger dig dock inte nyckelns värde. Baserat på det inlämnade github-problemet ser det inte ut som att du kan förvänta dig att ha den här funktionen inbyggd när som helst snart om någonsin (https://github.com/antirez/redis/issues/1876). Lösningen jag använder är att skapa en speciell "skugg"-utgångsnyckel som är länkad till nyckeln där du har ett verkligt värde.

Så låt oss säga att du har en nyckel som heter testkey och den har ett heltalsvärde på 100 . Dessutom kommer nyckeln att förfalla efter 10 sekunder vid vilken tidpunkt du vill få värdet på nyckeln. (Kanske du ökade nyckeln under de 10 sekunder den fanns).

Först måste du ställa in lyssning för keyspace-händelser. I synnerhet vill du lyssna efter expired evenemang. Du kan göra detta från din config eller använda config set kommando i redis. (se här för mer info:http://redis.io/topics/notifications)

CONFIG SET notify-keyspace-events Ex

Nu kan du prenumerera på en speciell keyevent kanal där du kommer att meddelas att nyckeln har gått ut.

SUBSCRIBE [email protected]__:expired

Formatet för kanalen att prenumerera på är [email protected]<db>__:<eventName> . I vårt exempel antar vi att vi arbetar med standarddatabasen 0 och vi vill lyssna efter den expired händelse.

När testkey går ut får du nu ett meddelande i __keyevent__ kanal där meddelandet är namnet på nyckeln som har gått ut. Naturligtvis vid det här laget är nyckeln borta så vi kan inte längre komma åt värdet! Lösningen är att använda en speciell utgångsnyckel.

När du skapar din testkey skapa även en speciell "skugg"-nyckel som löper ut (slut inte ut den faktiska testkey ). Till exempel:

SET testkey 100
SET shadowkey:testkey "" EX 10

Nu i [email protected]__:expired kanal kommer du att få ett meddelande som talar om att nyckeln shadowkey:testkey utgånget. Ta värdet på meddelandet (som är namnet på nyckeln), dela på kolon (eller vilken avgränsare du bestämmer dig för att använda) och hämta sedan värdet på nyckeln manuellt och ta bort 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

Observera att värdet på shadowkey inte används så du vill använda minsta möjliga värde som enligt detta svar (Redis store nyckel utan värde) är en tom sträng "" . Det är lite mer jobb att installera men ovanstående system gör precis vad du behöver. Overheaden är några extra kommandon för att faktiskt hämta och radera din nyckel plus lagringskostnaden för en tom nyckel.



  1. MongoDB $push

  2. Mongo tryck till array inuti array

  3. 10 frågor att ställa (och svara på) när du är värd för MongoDB på AWS

  4. Sortera kapslad array av objekt