Redis Zscan

Redis Zscan

Iterieren Sie die Mitglieder eines sortierten Sets

Wie Sie alle wissen, werden redis sortierte Sets aus den regulären Sätzen abgeleitet. Wenn zwei oder mehr Mitglieder den gleichen Punktzahl haben, werden sie nach lexikografischer Ordnung geordnet. Normalerweise können die Mitglieder und Bewertungen mit dem Befehl ZRange direkt abgerufen werden. Wenn Sie mit Tausenden von Mitgliedern ein großes sortiertes Set haben, blockiert der Befehl ZRange möglicherweise den Server für eine lange Zeit wie die Befehle für die Smembers and Keys, was ein Nachteil ist. Redis bietet also einen speziellen Befehl namens ZSCAN an, der aus dem Scan -Befehl abgeleitet ist, um die Mitglieder eines sortierten Satzes zu iterieren. Da der Befehl ZSCAN aus dem Befehl scan ererbt, entsprechen fast alle Verhaltens.

Wie in der angegebenen Abbildung ist der Scanbefehl ein Cursor-basierter Iterator. Daher benötigt es eine oder mehrere Iterationen, um alle Elemente einer Redis -Sammlung bereitzustellen. Da der Befehl zscan aus dem Befehl übergeordneter Scan erbt, ist das Verhalten das gleiche. In diesem Handbuch werden die Syntax- und Anwendungsfälle des ZSCAN -Befehls ausführlich erörtert.

Der ZSCAN -Befehl

Der ZSCAN-Befehl ist ein Cursor-basierter Iterator, der die Iteration mit dem 0. Cursor startet. Danach gibt es in jeder Iteration zusammen mit dem nächsten Cursor, der als Cursor für den folgenden Befehlsaufruf verwendet werden sollte. Wenn der zurückgegebene Cursor nach einer oder mehreren Iterationen 0 ist, bedeutet dies, dass der Scanprozess vorbei ist. Alle sortierten Set -Mitglieder werden an diesem Punkt zurückgegeben. Dieser Prozess wird als vollständige Iteration bezeichnet. Wie Sie sehen konnten, hält der Befehl ZSCAN seinen Zustand nur mit einem Cursor, der zu einem begrenzten Zustand des Zustands führt. Daher sind die folgenden Nachteile mit dem ZSCAN -Befehl verbunden.

  • Das gleiche Element kann in mehreren Iterationen zurückkehren.
  • Wenn ein Mitglied zu Beginn des Scanprozesses nicht vorhanden ist, besteht die Wahrscheinlichkeit, dieses Mitglied während einer vollständigen Iteration nicht zurückzugeben.

Darüber hinaus gibt es keine Garantie bei der Anzahl der zurückgegebenen Mitglieder. In einigen Fällen werden möglicherweise alle Mitglieder in der ersten Iteration zurückgegeben, wenn das sortierte Set sehr klein ist. Da Redis ein spezielles einzelnallokiertes Codierungsformat verwendet, um die Mitglieder zu halten, bis eine maximale Elementzahl erreicht ist. Der Befehl ZSCAN kann nur einen Cursor zurückgeben, wenn die gescannte Datenstruktur als Hash -Tabelle dargestellt wird.

Syntax:
Der Befehl ZSCAN verwendet fast dieselbe Syntax wie der Scan -Befehl. Die Befehlssyntax mit den zulässigen Argumenten lautet wie folgt:

ZSCAN sorted_set_key cursor [Match Muster] [count member_count]

sorted_set_key: Der Schlüssel des sortierten Satzes.
Mauszeiger: Der Cursorwert beginnt von 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 übereinstimmt. Nur die übereinstimmenden Mitglieder werden zurückgegeben.
ZÄHLEN: Die ungefähre Anzahl von Mitgliedern, die in jeder Iteration zurückgegeben werden sollen.

Das zurückgegebene Ergebnis -Set pro Iteration enthält ein paar Elemente. Der erste Teil ist eine 64-Bit-Ganzzahl, die den Cursor darstellt, der in den nächsten Anruf übergeben wird. Der nächste Teil ist eine Reihe von Mitgliedern und zugehörigen Punktzahlen.

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

Nehmen wir davon aus. Da massive Benutzer das Spiel aktiv spielen, benötigen sie eine Möglichkeit, jeden Spieler und deren zugehörige Punktzahl abzurufen, was die Anzahl der abgeschlossenen Missionen ist. Es ist ein Muss, das Abrufen durchzuführen, ohne den Server zu blockieren. Die Empfehlung lautet also, den Befehl ZSCAN wie folgt zu verwenden:

Zuerst erstellen wir ein sortiertes Set mit einigen Spielern und der abgeschlossenen Anzahl von Missionen.

Zadd Laupboard 12 Player6: John 4 Player2: Mary 22 Player1: Patel 15 Spieler: 11 23 Player5: Ann 30 Player7: Harsh 23 Player12: Abby 2 Player13: Nicky 6 Player9: Jeremy 7 Player45: Kina

Jetzt können wir die Mitglieder des sortierten Sets wie folgt iterieren:

ZSCAN -Rangliste 0

Ausgang:

Der Cursorwert beträgt 0 im zurückgegebenen Ergebnissatz, was bedeutet, dass alle Mitglieder am Ende der ersten Iteration zurückgegeben werden. In diesem Fall repräsentiert Redis, da die Anzahl der Mitglieder klein ist. Daher gibt der Befehl alle Mitglieder im sortierten Satz bis zur Erreichung einer maximalen Packgröße oder der Mitgliederzahl zurück. Dies wird als vollständige Iteration bezeichnet. Denn am Ende der ersten Iteration erhalten wir alle zehn Mitglieder und ihre Ergebnisse. Wenn wir Hunderte von Mitgliedern haben, wird es als Hash -Tabelle im Speicher dargestellt. Es braucht also mehrere Iterationen, um alle Mitglieder zurückzugeben.

Der Grafenparameter kann verwendet werden, um die Anzahl der in einer Iteration zurückgegebenen Mitglieder zu begrenzen. Standardmäßig ist dieses Argument auf 10 festgelegt. Wenn das sortierte Set aus Hunderten von Mitgliedern besteht, wird es durch eine Hash -Tabelle im Speicher dargestellt. Die Anzahl der zurückgegebenen Mitglieder beträgt also rund zehn pro Iteration. Der Wert des Zählarguments wird ignoriert, wenn der sortierte Satz zu klein ist.

Anwendungsfall 2 - Holen Sie sich die Spieler, deren Name mit dem Buchstaben "J" beginnt

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

Verwenden wir das gleiche Beispiel aus dem vorherigen Anwendungsfall. Die Anforderung besteht darin, die Spieler zu holen, deren Name mit dem Buchstaben „J“ beginnt. Es ist nur darum, die nächste coole Funktion im Zusammenhang mit dem Spiel zu implementieren. Das Match -Argument kann wie folgt angegeben werden:

ZSCAN -Rangliste 0 Match *J *

Dies sollte idealerweise zwei Mitglieder zurückgeben, deren Namen Jeremy und John sind.

Abschluss

Zusammenfassend wird der Befehl ZSCAN verwendet. Dieser Befehl verhält den Befehl scan, außer dass der Befehl zscan die festgelegte Schlüssel als erstes Argument akzeptiert. Wie in den Anwendungsfällen erläutert, kann der Befehl ZSCAN auf unterschiedliche Weise verwendet werden. Insgesamt kann der ZSCAN -Befehl nützlich sein, wenn die Mitglieder eines sortierten Satzes abgerufen werden, ohne den Server oder Client zu blockieren.