sql >> Databasteknik >  >> NoSQL >> Redis

Redis Update Sorterad Set vid Key Expire

Du har rätt att du inte kan "sätta ett utgångsdatum" på själva det sorterade inställda värdet.

Men du kan arbeta med huvudnyckeln och fånga händelsen när utgången inträffar. Du har minst två sätt att uppnå detta:

  • Använda Key Space Notification
  • Använda Redis Gears

Key Space Notification

Med Key Space Notification kan du fånga EXPIRE-händelsen som skickar ett PUBLISH-meddelande som du sedan kan konsumera.

Låt mig förklara det grundläggande flödet:

Konfigurera aviseringar

CONFIG SET notify-keyspace-events Ex
  • E :händelser som händer på nycklar
  • x :fånga utgångna händelser

Nu kommer din databas att publicera en händelse på __key*__:* kanal.

Så du kan bygga en tjänst som lyssnar på dessa händelser uppdatera uppsättningen (direkt eller indirekt):

psubscribe __key*__:*

Om du har ett program som anger följande värde och utgångsdatum

set foo bar EX 5

Du bör få följande meddelande

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

Redis Gears

Med Redis Gears fångar du samma händelse (det är också baserat på avisering), men det är lättare att skriva kod direkt i din Redis-databas.

Du kan skapa ett Gears enligt följande:(detta är ett Python-skript, jag använder RedisInsight för att distribuera det till Redis)

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)

Titta på avsnittet som startas av cap = GB('KeysReader')

  • Detta lyssnar på alla nyckelutgångar prefix='*' &eventTypes=['expired']
  • Om det löper ut kommer det att lägga till ett meddelande till 'expired:events' Redis Stream med XADD-kommandot
  • Titta sedan på funktionen proc = GB('StreamReader') som kommer att bearbeta strömmarna
  • varje gång ett nytt meddelande finns i flödet anropar det process() funktion.

Du kan lägga till din logik för att uppdatera den sorterade uppsättningen i den här funktionen. I mitt exempel har jag precis lagt till den utgångna nyckeln till en lista.

Låt mig avvika lite från din första fråga.

Det verkar som att du använder Sorterad uppsättning för att skapa någon form av indexering för dina data.

Om så är fallet bör du titta på RediSearch, en annan Redis-modul som låter dig indexera Hash fält och använd sedan indexet för att göra några avancerade frågor och aggregering.

Med RediSearch behöver du inte lägga till någon kod för att hantera indexet, det görs automatiskt av databasen och du kan fråga i fälten.

Jag bjuder in dig att titta på:

  • RediSearch-modulen
  • Komma igång med RediSearch

Ursäkta om detta inte är anledningen till att du använder sorterad uppsättning, men jag tycker att det är värt att kolla eftersom det kan förenkla din applikationskod mycket om du hanterar index manuellt idag.




  1. Golang + MongoDB inbäddad typ (bäddar in en struktur i en annan struktur)

  2. redis lua script kontra enstaka samtal

  3. Hur kan jag läsa från Redis i ett MULTI-block i Ruby?

  4. Mongoose - RangeError:Maximal anropsstapelstorlek har överskridits