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.