sql >> Database teknologi >  >> NoSQL >> Redis

Redis Update Sorteret Sæt ved Key Expire

Du har ret, du kan ikke "sætte et udløb" på selve den sorterede sætværdi.

Men du kan arbejde med hovednøglen og fange begivenheden, når udløbet indtræffer. Du har mindst 2 måder at opnå dette på:

  • Brug af Key Space Notification
  • Brug af Redis Gears

Nøglepladsmeddelelse

Ved at bruge Key Space Notification kan du fange EXPIRE-hændelsen, der sender en UDGIVELSE-meddelelse, som du derefter kan bruge.

Lad mig forklare det grundlæggende flow:

Konfigurer meddelelser

CONFIG SET notify-keyspace-events Ex
  • E :begivenheder, der sker på nøgler
  • x :opfang udløbne hændelser

Nu vil din database udgive en begivenhed på __key*__:* kanal.

Så du kan bygge en tjeneste, der lytter til disse begivenheder, opdatere sættet (direkte eller indirekte):

psubscribe __key*__:*

Hvis du har et program, der angiver følgende værdi og udløb

set foo bar EX 5

Du bør modtage følgende besked

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

Redis Gears

Ved at bruge Redis Gears fanger du den samme hændelse (det er også baseret på notifikation), men det er nemmere at skrive kode direkte i din Redis-database.

Du kan oprette et Gears som følger:(dette er et Python-script, jeg bruger RedisInsight til at implementere det til 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)

Se på sektionen startet af cap = GB('KeysReader')

  • Dette vil lytte til enhver nøgleudløb prefix='*' &eventTypes=['expired']
  • I tilfælde af udløb vil den tilføje en besked til 'expired:events' Redis Stream ved hjælp af XADD-kommandoen
  • Kig derefter på funktionen proc = GB('StreamReader') der vil behandle strømmene
  • hver gang en ny besked er i strømmen, kalder den process() funktion.

Du kan tilføje din logik for at opdatere det sorterede sæt i denne funktion. I mit eksempel har jeg lige tilføjet den udløbne nøgle til en liste.

Lad mig afvige lidt fra dit indledende spørgsmål.

Det ser ud til, at du bruger Sorteret sæt til at oprette en form for indeksering af dine data.

Hvis dette er tilfældet, bør du se på RediSearch, et andet Redis-modul, der giver dig mulighed for at indeksere Hash felter og derefter bruge indekset til at lave nogle avancerede forespørgsler og aggregering.

Med RediSearch behøver du ikke tilføje nogen kode for at administrere indekset, det gøres automatisk af databasen, og du kan forespørge på felterne.

Jeg inviterer dig til at se på:

  • RediSearch-modulet
  • Kom godt i gang med RediSearch

Beklager, hvis dette ikke er grunden til, at du bruger Sorteret sæt, men jeg synes, det er værd at tjekke, da det kan forenkle din applikationskode meget, hvis du administrerer indekset manuelt i dag.




  1. Opretter forbindelse til administreret redis med auth brugernavn/adgangskode nodejs

  2. Gå gennem alle Mongo-samlinger og udfør forespørgslen

  3. Fejl:Redis forbindelse til 127.0.0.1:6379 mislykkedes - tilslut ECONNREFUSED 127.0.0.1:6379

  4. Placering i mongoose, mongoDB