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

Aktualizace Redis seřazená sada po vypršení platnosti klíče

Máte pravdu, že nemůžete "uložit expiraci" na seřazenou nastavenou hodnotu samotnou.

Ale můžete pracovat s hlavním klíčem a zachytit událost, když dojde k vypršení platnosti. Máte alespoň 2 způsoby, jak toho dosáhnout:

  • Použití upozornění Key Space
  • Používání Redis Gears

Oznámení o klíčovém prostoru

Pomocí Key Space Notification můžete zachytit událost EXPIRE, která odešle zprávu PUBLISH, kterou pak můžete využít.

Dovolte mi vysvětlit základní postup:

Konfigurace oznámení

CONFIG SET notify-keyspace-events Ex
  • E :události probíhající na klávesách
  • x :zachycení událostí, jejichž platnost vypršela

Nyní vaše databáze zveřejní událost na __key*__:* kanál.

Můžete tedy vytvořit službu, která naslouchá těmto událostem a aktualizuje sadu (přímo nebo nepřímo):

psubscribe __key*__:*

Pokud máte aplikaci, která nastavuje následující hodnotu a expiraci

set foo bar EX 5

Měli byste obdržet následující zprávu

1) "pmessage"
2) "__key*__:*"
3) "[email protected]__:expired"
4) "foo"

Redis Gears

Pomocí Redis Gears zachytíte stejnou událost (je to také založeno na oznámení), ale je jednodušší psát kód přímo do vaší databáze Redis.

Gears můžete vytvořit následovně:(toto je skript Python, k jeho nasazení do Redis používám RedisInsight)

def process(x):
    execute('LPUSH', 'expired:keys', x['value']['key']);

# Capture an expiration event and adds it to 'expired:events' stream
cap = GB('KeysReader')
cap.foreach(lambda x:
            execute('XADD', 'expired:events', '*', 'key', x['key']))
cap.register(prefix='*',
             mode='sync',
             eventTypes=['expired'],
             readValue=False)

# Consume new messages from expiration streams and process them somehow
proc = GB('StreamReader')
proc.foreach(process)
proc.register(prefix='expired:*',
              batch=100,
              duration=1, 
              trimStream = False)

Podívejte se na sekci začínající cap = GB('KeysReader')

  • To bude poslouchat vypršení platnosti každého klíče prefix='*' &eventTypes=['expired']
  • V případě vypršení platnosti přidá zprávu do 'expired:events' Redis Stream pomocí příkazu XADD
  • Potom se podívejte na funkci proc = GB('StreamReader') který zpracuje proudy
  • pokaždé, když je ve streamu nová zpráva, zavolá process() funkce.

V této funkci můžete přidat svou logiku a aktualizovat seřazenou sadu. V mém příkladu jsem právě přidal prošlý klíč do seznamu.

Dovolte mi trochu odbočit od vaší úvodní otázky.

Vypadá to, že používáte třídenou sadu k vytvoření nějaké formy indexování pro svá data.

Pokud je to váš případ, měli byste se podívat na RediSearch, další modul Redis, který vám umožňuje indexovat Hash pole a poté použijte index k provedení některých pokročilých dotazů a agregace.

S RediSearch nepotřebujete přidávat žádný kód pro správu indexu, provádí to automaticky databáze a můžete se dotazovat na pole.

Zvu vás, abyste se podívali na:

  • Modul RediSearch
  • Začínáme s RediSearch

Omlouváme se, pokud toto není důvod, proč používáte Sorted Set, ale myslím, že stojí za to zkontrolovat, protože by to mohlo značně zjednodušit kód vaší aplikace, pokud dnes spravujete index ručně.




  1. Mongodb $lookup Nefunguje s _id

  2. Jak mohu číst z Redis uvnitř MULTI bloku v Ruby?

  3. Nodejs Mongo vložit do vnořeného dokumentu - dynamický název pole

  4. Kompozitní klíč MongoDB