Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis Update Sorted Set on Key Expire

Sie haben Recht, Sie können den sortierten Set-Wert selbst nicht "verfallen" lassen.

Sie können jedoch mit dem Hauptschlüssel arbeiten und das Ereignis erfassen, wenn der Ablauf eintritt. Sie haben mindestens zwei Möglichkeiten, dies zu erreichen:

  • Schlüsselraumbenachrichtigung verwenden
  • Verwendung von Redis Gears

Schlüsselraum-Benachrichtigung

Mit Key Space Notification 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, die auf Tasten passieren
  • x :abgelaufene Ereignisse erfassen

Jetzt veröffentlicht Ihre Datenbank ein Ereignis auf __key*__:* Kanal.

Sie können also einen Dienst bauen, der auf diese Ereignisse lauscht, um den Satz zu aktualisieren (direkt oder indirekt):

psubscribe __key*__:*

Wenn Sie eine Anwendung haben, die den folgenden Wert und das folgende Ablaufdatum festlegt

set foo bar EX 5

Sie sollten die folgende Nachricht erhalten

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

Redis Gears

Mit Redis Gears erfassen Sie dasselbe Ereignis (es basiert ebenfalls auf Benachrichtigungen), aber es ist einfacher, Code direkt in Ihre Redis-Datenbank zu schreiben.

Sie können Gears wie folgt erstellen:(Dies ist ein Python-Skript, ich verwende RedisInsight, um es in 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)

Sehen Sie sich den Abschnitt an, der mit cap = GB('KeysReader') beginnt

  • Dies lauscht auf jeden Schlüsselablauf prefix='*' &eventTypes=['expired']
  • Bei Ablauf wird eine Nachricht zum 'expired:events' hinzugefügt Redis Stream mit dem XADD-Befehl
  • Schauen Sie sich dann die Funktion proc = GB('StreamReader') an die die Streams verarbeitet
  • Jedes Mal, wenn sich eine neue Nachricht im Stream befindet, wird der process() aufgerufen Funktion.

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.

Wenn dies der Fall ist, sollten Sie sich RediSearch ansehen, ein weiteres Redis-Modul, mit dem Sie Hash indizieren können Felder und verwenden Sie dann den Index, um einige erweiterte Abfragen und Aggregationen durchzuführen.

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 ersten Schritte mit RediSearch

Tut mir leid, wenn dies nicht der Grund ist, warum Sie Sorted Set verwenden, aber ich denke, es lohnt sich, es zu überprüfen, da dies Ihren Anwendungscode erheblich vereinfachen könnte, wenn Sie den Index heute manuell verwalten.