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

jak zacházet s vypršením platnosti relace na základě redis?

Takže potřebujete, aby vaše aplikace byla upozorněna, když relace vyprší v Redis.

I když Redis tuto funkci nepodporuje, existuje řada triků, jak ji implementovat.

Aktualizace:Od verze 2.8.0 společnost Redis podporuje toto http://redis.io/topics/notifications

Za prvé, lidé o tom přemýšlejí:stále se o tom diskutuje, ale může být přidáno do budoucí verze Redis. Viz následující problémy:

  • https://github.com/antirez/redis/issues/83
  • https://github.com/antirez/redis/issues/594

Zde jsou některá řešení, která můžete použít s aktuálními verzemi Redis.

Řešení 1:záplatování Redis

Ve skutečnosti přidání jednoduchého upozornění, když Redis provede vypršení platnosti klíče, není tak těžké. Lze jej implementovat přidáním 10 řádků do souboru db.c zdrojového kódu Redis. Zde je příklad:

https://gist.github.com/3258233

Pokud platnost klíče vypršela, tato krátká oprava zveřejní klíč do seznamu #expired a začíná znakem '@' (libovolná volba). Lze jej snadno přizpůsobit vašim potřebám.

Pak je triviální použít příkazy EXPIRE nebo SETEX k nastavení doby vypršení platnosti pro vaše objekty relace a napsat malého démona, který se zacyklí na BRPOP, aby se vyřadil z fronty ze seznamu „#expired“ a šířil oznámení ve vaší aplikaci.

Důležitým bodem je pochopit, jak funguje mechanismus expirace v Redis. Ve skutečnosti existují dvě různé cesty pro vypršení platnosti, obě aktivní ve stejnou dobu:

  • Lazy (pasivní) mechanismus. K vypršení platnosti může dojít při každém přístupu ke klíči.

  • Aktivní mechanismus. Interní úloha pravidelně (náhodně) vzorkuje několik klíčů s nastavenou expirací a snaží se najít ty, kterým vyprší platnost.

Všimněte si, že výše uvedený patch funguje dobře s oběma cestami.

Důsledkem je, že doba expirace Redis není přesná. Pokud platnost všech klíčů vypršela, ale pouze jednomu brzy vyprší platnost a není přístupný, může aktivní úloze vypršení platnosti trvat několik minut, než klíč najde a jeho platnost vyprší. Pokud potřebujete určitou přesnost v oznámení, toto není správná cesta.

Řešení 2:simulace expirace pomocí zsets

Myšlenka je nespoléhat se na mechanismus vypršení platnosti klíče Redis, ale simulovat jej pomocí dalšího indexu a démona dotazování. Může pracovat s neupravenou verzí Redis 2.6.

Pokaždé, když je do Redis přidána relace, můžete spustit:

MULTI
SET <session id> <session content>
ZADD to_be_expired <current timestamp + session timeout> <session id>
EXEC

Seřazená sada to_be_expired je pouze efektivní způsob, jak získat přístup k prvním klíčům, kterým by měla vypršet platnost. Démon může dotazovat na to_be_expired pomocí následujícího skriptu na straně serveru Lua:

local res = redis.call('ZRANGEBYSCORE',KEYS[1], 0, ARGV[1], 'LIMIT', 0, 10 )
if #res > 0 then
   redis.call( 'ZREMRANGEBYRANK', KEYS[1], 0, #res-1 )
   return res
else
   return false
end

Příkaz ke spuštění skriptu by byl:

EVAL <script> 1 to_be_expired <current timestamp>

Démon získá maximálně 10 předmětů. Pro každou z nich musí použít příkaz DEL k odstranění relací a upozornit aplikaci. Pokud byla jedna položka skutečně zpracována (tj. návrat skriptu Lua není prázdný), démon by měl okamžitě zacyklit, jinak může být zaveden stav čekání 1 sekundy.

Díky skriptu Lua je možné paralelně spouštět několik démonů dotazování (skript zaručuje, že daná relace bude zpracována pouze jednou, protože klíče jsou odstraněny z to_be_expired samotným skriptem Lua).

Řešení 3:použijte externí distribuovaný časovač

Dalším řešením je spolehnout se na externí distribuovaný časovač. Odlehčený systém řazení fazolí do fronty je pro to dobrou možností

Pokaždé, když je do systému přidána relace, aplikace odešle ID relace do fronty beanstalk se zpožděním odpovídajícím časovému limitu relace. Démon poslouchá frontu. Když může vyřadit položku z fronty, znamená to, že relace vypršela. Stačí vyčistit relaci v Redis a upozornit aplikaci.




  1. Objekt MongoDB serializovaný jako JSON

  2. Redis - sledování využití paměti

  3. Mongoose vnořené dokumenty vs vnořené schéma

  4. Uložte kolekci Mongo do formátu JSON