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.