Redis ZSCAN

Redis Zscan



Iterieren Sie über die Mitglieder einer sortierten Menge

Wie Sie alle wissen, werden die sortierten Sätze von Redis von den regulären Sätzen abgeleitet, bei denen jedes Mitglied nach seinem Punktewert in aufsteigender Reihenfolge geordnet ist. Wenn zwei oder mehr Mitglieder den gleichen Punktwert haben, werden sie nach lexikografischer Reihenfolge geordnet. Normalerweise können die Mitglieder und Ergebnisse direkt mit dem ZRANGE-Befehl abgerufen werden. Wenn Sie eine große sortierte Menge mit Tausenden von Mitgliedern haben, blockiert der Befehl ZRANGE den Server möglicherweise für lange Zeit, wie die Befehle SMEMBERS und KEYS, was ein Nachteil ist. Daher bietet Redis einen speziellen Befehl namens ZSCAN an, der vom SCAN-Befehl abgeleitet ist, um über die Mitglieder einer sortierten Menge zu iterieren. Da der ZSCAN-Befehl vom SCAN-Befehl erbt, sind fast alle Verhaltensweisen die gleichen wie beim Allzweck-SCAN-Befehl.







Wie in der gegebenen Abbildung ist der SCAN-Befehl ein Cursor-basierter Iterator. Daher sind eine oder mehrere Iterationen erforderlich, um alle Elemente einer Redis-Sammlung bereitzustellen. Da der ZSCAN-Befehl vom übergeordneten SCAN-Befehl erbt, ist das Verhalten dasselbe. In diesem Handbuch werden die Syntax und die Anwendungsfälle des ZSCAN-Befehls ausführlich besprochen.



Der ZSCAN-Befehl

Der ZSCAN-Befehl ist ein Cursor-basierter Iterator, der die Iteration mit dem 0-ten Cursor beginnt. Danach gibt es bei jeder Iteration null oder mehr sortierte Mengenmitglieder zusammen mit dem nächsten Cursor zurück, der als Cursor für den folgenden Befehlsaufruf verwendet werden soll. Wenn der zurückgegebene Cursor nach einer oder mehreren Iterationen 0 ist, bedeutet dies, dass der Scanvorgang beendet ist. Alle sortierten Satzmitglieder werden an dieser Stelle zurückgegeben. Dieser Vorgang wird als vollständige Iteration bezeichnet. Wie Sie sehen konnten, hält der ZSCAN-Befehl seinen Zustand nur mit einem Cursor, was zu einer begrenzten Zustandswahrnehmung führt. Daher sind die folgenden Nachteile mit dem ZSCAN-Befehl verbunden.



  • Dasselbe Element kann in mehreren Iterationen zurückgegeben werden.
  • Wenn ein Mitglied zu Beginn des Scanvorgangs nicht vorhanden ist, besteht die Wahrscheinlichkeit, dass dieses Mitglied während einer vollständigen Iteration nicht zurückgegeben wird.

Außerdem gibt es keine Garantie auf die Anzahl der zurückgekehrten Mitglieder. In einigen Fällen, wenn die sortierte Menge sehr klein ist, werden möglicherweise alle Mitglieder in der allerersten Iteration zurückgegeben. Weil Redis ein spezielles gepacktes Codierungsformat mit Einzelzuweisung verwendet, um die Mitglieder zu halten, bis eine maximale Anzahl von Elementen erreicht ist. Der ZSCAN-Befehl kann nur dann einen Cursor zurückgeben, wenn die gescannte Datenstruktur als Hash-Tabelle dargestellt wird.





Syntax:
Der ZSCAN-Befehl verwendet fast die gleiche Syntax wie der SCAN-Befehl, außer dass er einen sortierten Set-Schlüssel als erstes Argument akzeptiert. Die Befehlssyntax mit den zulässigen Argumenten lautet wie folgt:

ZSCAN sorted_set_key-Cursor [ MATCH-Muster ] [ COUNT Mitgliederzahl ]

sorted_set_key : Der Schlüssel des sortierten Satzes.
Mauszeiger : Der Cursorwert beginnt bei 0 und endet bei 0, wenn es sich um eine vollständige Iteration handelt.



Die folgenden Argumente sind optional:

PASSEN : Ein Muster, das beim Abrufen der Elemente in jeder Iteration abgeglichen werden muss. Nur die übereinstimmenden Elemente werden zurückgegeben.
ZÄHLEN : Die ungefähre Anzahl von Membern, die in jeder Iteration zurückgegeben werden sollen.

Die zurückgegebene Ergebnismenge pro Iteration enthält einige Elemente. Der erste Teil ist eine 64-Bit-Ganzzahl ohne Vorzeichen, die den Cursor darstellt, der an den nächsten Aufruf übergeben werden soll. Der nächste Teil ist ein Array von Mitgliedern und zugehörigen Partituren.

Anwendungsfall 1 – Rufen Sie alle Mitglieder und ihre abgeschlossenen Missionen eines Online-Spiels ab

Nehmen wir an, dass ein Online-Spieleunternehmen eine Rangliste unter Verwendung des sortierten Satzes von Redis führt. Da massive Benutzer das Spiel aktiv spielen, brauchen sie eine Möglichkeit, jeden Spieler und seine zugehörige Punktzahl, dh die Anzahl der abgeschlossenen Missionen, abzurufen. Es ist ein Muss, den Abruf durchzuführen, ohne den Server zu blockieren. Die Empfehlung lautet also, den ZSCAN-Befehl wie folgt zu verwenden:

Zunächst erstellen wir ein sortiertes Set mit einigen Spielern und der absolvierten Anzahl an Missionen.

zadd LeaderBoard 12 Spieler6: John 4 Spieler2: Maria 22 Spieler1:Patel fünfzehn Spieler: elf 23 Spieler5:Ann 30 Spieler7:Hart 23 Spieler12:Abby zwei Spieler13: Nicky 6 Spieler9: Jeremy 7 Spieler45: Kina

Nun können wir wie folgt über die Mitglieder der sortierten Menge iterieren:

zscan LeaderBoard 0

Ausgabe:

Der Cursorwert in der zurückgegebenen Ergebnismenge ist 0, was bedeutet, dass alle Elemente am Ende der ersten Iteration zurückgegeben werden. Da die Anzahl der Mitglieder in diesem Fall klein ist, stellt Redis diese Mitglieder mit einer gepackten Codierung mit Einzelzuweisung dar. Daher gibt der Befehl alle Mitglieder in der sortierten Menge zurück, bis eine maximale Paketgröße oder Mitgliederanzahl erreicht ist. Dies wird als vollständige Iteration bezeichnet. Denn am Ende der ersten Iteration erhalten wir alle zehn Mitglieder und ihre Punktzahlen. Wenn wir Hunderte von Mitgliedern haben, wird es als Hash-Tabelle im Speicher dargestellt. Es sind also mehrere Iterationen erforderlich, um alle Mitglieder zurückzugeben.

Der COUNT-Parameter kann verwendet werden, um die Anzahl der Elemente zu begrenzen, die in einer Iteration zurückgegeben werden. Standardmäßig ist dieses Argument auf 10 gesetzt. Wenn die sortierte Menge aus Hunderten von Elementen besteht, wird sie durch eine Hash-Tabelle im Speicher dargestellt. Die Anzahl der zurückgegebenen Mitglieder beträgt also etwa zehn pro Iteration. Der Wert des COUNT-Arguments wird ignoriert, wenn die sortierte Menge zu klein ist.

Anwendungsfall 2 – Abrufen der Spieler, deren Name mit dem Buchstaben „J“ beginnt

Der ZSCAN-Befehl kann verwendet werden, um die zurückgegebenen Mitglieder basierend auf einer Musterübereinstimmung herauszufiltern. In diesem Fall muss das MATCH-Argument angegeben werden.

Lassen Sie uns dasselbe Beispiel aus dem vorherigen Anwendungsfall verwenden. Die Anforderung besteht darin, die Spieler zu holen, deren Name mit dem Buchstaben „J“ beginnt. Es dient nur dazu, das nächste coole Feature im Zusammenhang mit dem Spiel zu implementieren. Das MATCH-Argument kann wie folgt angegeben werden:

zscan LeaderBoard 0 passen * J *

Dies sollte idealerweise zwei Mitglieder mit den Namen Jeremy und John zurückgeben.

Fazit

Zusammenfassend lässt sich sagen, dass der ZSCAN-Befehl verwendet wird, um die Mitglieder und Bewertungen eines sortierten Redis-Satzes zu durchlaufen. Dieser Befehl verhält sich genauso wie der SCAN-Befehl, außer dass der ZSCAN-Befehl den Set-Schlüssel als erstes Argument akzeptiert. Wie in den Anwendungsfällen besprochen, kann der ZSCAN-Befehl auf verschiedene Weise verwendet werden, indem Sie die Argumente MATCH und COUNT angeben, mit denen Sie die Elemente und zugehörigen Bewertungen abrufen können, die einem bestimmten Muster entsprechen, und die zurückgegebene Elementanzahl pro Iteration begrenzen. Insgesamt kann der ZSCAN-Befehl beim Abrufen der Mitglieder einer sortierten Menge nützlich sein, ohne den Server oder Client zu blockieren.