sql >> Databáze >  >> NoSQL >> Redis

Oznámení Redis:Získejte klíč a hodnotu po vypršení platnosti

Funkce, se kterou Eli navázal, vám umožňuje poslouchat, když vyprší platnost klíče. Nedá vám však hodnotu klíče. Navíc na základě podaného problému s githubem to nevypadá, že byste mohli očekávat, že tuto funkci budete mít zabudovanou kdykoli, pokud vůbec někdy (https://github.com/antirez/redis/issues/1876). Řešení, které používám, je vytvořit speciální „stínový“ klíč vypršení platnosti, který je propojen s klíčem, kde máte skutečnou hodnotu.

Řekněme tedy, že máte klíč nazvaný testkey a má celočíselnou hodnotu 100 . Kromě toho platnost klíče vyprší po 10 sekundách, kdy chcete získat hodnotu klíče. (Možná jste zvyšovali klíč během 10 sekund, kdy existoval).

Nejprve musíte nastavit naslouchání událostem klíčového prostoru. Konkrétně chcete poslouchat, zda expired Události. Můžete to udělat z vaší konfigurace nebo použít config set příkaz v redis. (další informace naleznete zde:http://redis.io/topics/notifications)

CONFIG SET notify-keyspace-events Ex

Nyní se můžete přihlásit k odběru speciální keyevent kanál, kde budete upozorněni, že platnost klíče vypršela.

SUBSCRIBE [email protected]__:expired

Formát kanálu k odběru je [email protected]<db>__:<eventName> . V našem příkladu předpokládáme, že pracujeme s výchozí databází 0 a chceme naslouchat, zda expired událost.

Když testkey vyprší, nyní dostanete zprávu v __keyevent__ kanál, kde zpráva je název klíče, jehož platnost vypršela. Samozřejmě v tomto okamžiku je klíč pryč, takže k hodnotě již nemáme přístup! Řešením je použití speciálního expiračního klíče.

Když vytvoříte svůj testkey také vytvořte speciální „stínový“ klíč s vypršením platnosti (nevyprší platnost skutečného testkey ). Například:

SET testkey 100
SET shadowkey:testkey "" EX 10

Nyní v [email protected]__:expired kanálu, obdržíte zprávu s informací, že klíč shadowkey:testkey platnost vypršela. Vezměte hodnotu zprávy (což je název klíče), rozdělte ji na dvojtečku (nebo jakýkoli oddělovač, který se rozhodnete použít) a poté ručně získejte hodnotu klíče a odstraňte ji.

// 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

Všimněte si, že hodnota stínového klíče se nepoužívá, takže chcete použít nejmenší možnou hodnotu, která je podle této odpovědi (klíč úložiště Redis bez hodnoty) prázdný řetězec "" . S nastavením je to trochu více práce, ale výše uvedený systém dělá přesně to, co potřebujete. Režie je několik dalších příkazů pro skutečné načtení a odstranění vašeho klíče plus náklady na uložení prázdného klíče.



  1. existuje způsob, jak získat IP klienta v redis?

  2. Dotaz Mongoose near(...) na indexované pole 2dsphere nevrací platné výsledky

  3. Název pole ID entity ServiceStack

  4. MongoDB $push