Redis Update Sorted Set on Key Expire
Ich habe einen Redis-Server mit einer Reihe von Schlüsselwertpaaren und einer sortierten Menge, die einen Index der Schlüssel dieser Schlüsselwertpaare bereitstellt.
Die Schlüsselwertpaare können in den Status "abgeschlossen" versetzt werden und müssen zu diesem Zeitpunkt nach 1 Stunde gelöscht werden. Dies kann einfach erreicht werden, indem für die Schlüssel ein Ablaufdatum festgelegt wird. Das Löschen dieser Schlüssel aus dem sortierten Satz erscheint jedoch problematischer.
Ich könnte einen Prozess haben, der die Sets scannt und von Zeit zu Zeit aktualisiert, aber es wäre schön, wenn etwas sauberer wäre.
Ich glaube nicht, dass es eine Möglichkeit gibt, bei Ablauf so etwas wie eine gespeicherte Prozedur auszulösen oder einen Ablauf für die sortierten eingestellten Werte festzulegen.
Was ich vermisst habe oder ist manuell der einzige Weg?
Antworten
Sie haben Recht, Sie können den sortierten Sollwert selbst nicht "ablaufen lassen".
Sie können jedoch mit dem Hauptschlüssel arbeiten und das Ereignis erfassen, wenn der Ablauf eintritt. Sie haben mindestens zwei Möglichkeiten, um dies zu erreichen:
- Verwenden der Key Space-Benachrichtigung
- Verwenden von Redis-Zahnrädern
Key Space-Benachrichtigung
Mit der Key Space-Benachrichtigung können Sie das EXPIRE-Ereignis erfassen, das eine PUBLISH-Nachricht sendet, die Sie dann verwenden können.
Lassen Sie mich den grundlegenden Ablauf erklären:
Benachrichtigungen konfigurieren
CONFIG SET notify-keyspace-events Ex
- E : Ereignisse auf Schlüsseln
- x : Abgelaufene Ereignisse erfassen
Jetzt veröffentlicht Ihre Datenbank ein Ereignis auf dem __key*__:*Kanal.
Sie können also einen Dienst erstellen, der diese Ereignisse abhört und die Menge (direkt oder indirekt) aktualisiert:
psubscribe __key*__:*
Wenn Sie eine Anwendung haben, die den folgenden Wert und Ablauf festlegt
set foo bar EX 5
Sie sollten die folgende Nachricht erhalten
1) "pmessage"
2) "__key*__:*"
3) "__keyevent@0__:expired"
4) "foo"
Redis Zahnräder
Mit Redis Gears erfassen Sie dasselbe Ereignis (es basiert auch auf Benachrichtigungen), aber es ist einfacher, Code direkt in Ihre Redis-Datenbank zu schreiben.
Sie können ein Zahnrad wie folgt erstellen: (Dies ist ein Python-Skript. Ich verwende RedisInsight, um es für Redis bereitzustellen.)
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)
Schauen Sie sich den Abschnitt an, der mit begonnen hat cap = GB('KeysReader')
- Dies hört auf jeden Schlüsselablauf
prefix='*'&eventTypes=['expired'] - Im Falle eines Ablaufs wird dem
'expired:events'Redis Stream mit dem Befehl XADD eine Nachricht hinzugefügt - Schauen Sie sich dann die Funktion an
proc = GB('StreamReader'), mit der die Streams verarbeitet werden - Jedes Mal, wenn eine neue Nachricht im Stream ist, wird die
process()Funktion aufgerufen .
Sie können Ihre Logik hinzufügen, um den sortierten Satz in dieser Funktion zu aktualisieren. In meinem Beispiel habe ich gerade den abgelaufenen Schlüssel zu einer Liste hinzugefügt.
Lassen Sie mich ein wenig von Ihrer ursprünglichen Frage abweichen.
Es sieht so aus, als würden Sie Sorted Set verwenden, um eine Art Indizierung für Ihre Daten zu erstellen.
In diesem Fall sollten Sie sich RediSearch ansehen, ein weiteres Redis-Modul, mit dem Sie Hash- Felder indizieren und dann mithilfe des Index einige erweiterte Abfragen und Aggregationen durchführen können.
Mit RediSearch müssen Sie keinen Code hinzufügen, um den Index zu verwalten. Dies wird automatisch von der Datenbank durchgeführt und Sie können die Felder abfragen.
Ich lade Sie ein, sich Folgendes anzusehen:
- Das RediSearch-Modul
- Die RediSearch Erste Schritte
Es tut uns leid, wenn dies nicht der Grund ist, warum Sie Sorted Set verwenden, aber ich denke, es lohnt sich zu überprüfen, da dies Ihren Anwendungscode erheblich vereinfachen könnte, wenn Sie den Index heute manuell verwalten.