Redis Update Sorted Set on Key Expire

Oct 13 2020

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

3 TugGrall Oct 13 2020 at 18:43

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.