[Redis] Eingehende Untersuchung der Redis-Datentypen – geordnete Menge ZSet


1. Einführung in den ZSet-Typ

ZSet (geordnete Menge) ist ein Datentyp in der Redis-Datenbank. Es handelt sich um eine ungeordnete Menge. Jedem Element ist eine Gleitkommabewertung zugeordnet, sodass die Elemente in der Menge entsprechend der Bewertung sortiert werden können. ZSet wird oft auch als Sorted Set bezeichnet.

Funktionen und Verwendungsmöglichkeiten:

  1. Einzigartigkeit der Elemente : Die Elemente in ZSet sind einzigartig und doppelte Elemente sind nicht zulässig.

  2. Ordnung : Im Gegensatz zu gewöhnlichen Mengen sind die Elemente in ZSet der Reihe nach angeordnet und von klein nach groß entsprechend der Punktzahl der Elemente sortiert.

  3. Bewertungen sind mit Elementen verknüpft : Jedes Element ist mit einer Bewertung verknüpft, die zur Bestimmung der Position des Elements verwendet wird.

  4. Effiziente Mitgliedersuche : Redis bietet effiziente Mitgliedersuchvorgänge, mit denen Bewertungen basierend auf Mitgliedsnamen schnell gefunden werden können.

  5. Bereichsabfrage : ZSet unterstützt Abfragen basierend auf dem Bewertungsbereich, z. B. das Abrufen von Elementen mit Bewertungen innerhalb eines bestimmten Bereichs.

  6. Rangliste : ZSet wird häufig zum Erstellen einer Rangliste verwendet, wobei die Punktzahl die Punktzahl des Benutzers oder andere Gewichtungswerte darstellen kann.

2. Befehle für den Typ ZSet (geordnete Menge).

ZSet (geordneter Satz) ist ein Datentyp in Redis. Er ähnelt Set, aber jedem Element ist eine Punktzahl (Punktzahl) zugeordnet, sodass die Elemente im Satz nach der Punktzahl sortiert werden können. Im Folgenden sind allgemeine Befehle im Zusammenhang mit ZSet aufgeführt:

2.1 ZADD

Der Befehl ZADD wird verwendet, um Elemente und ihre zugehörigen Bewertungen zu einem geordneten Satz hinzuzufügen oder zu aktualisieren. Der Bruch muss vom Typ „doppelt“ sein und kann positiv, negativ, positiv oder negativ unendlich usw. sein. Zu den relevanten Optionen für den ZADD-Befehl gehören:

  • NX : Wird nur zum Hinzufügen neuer Elemente verwendet, aktualisiert keine vorhandenen Elemente.
  • XX : Wird nur zum Aktualisieren vorhandener Elemente verwendet, es werden keine neuen Elemente hinzugefügt.
  • CH : Standardmäßig gibt ZADD die Anzahl der hinzugefügten Elemente zurück, aber wenn diese Option angegeben ist, gibt es die Anzahl der hinzugefügten und aktualisierten Elemente zurück.
  • INCR : Diese Option ähnelt dem ZINCRBY-Befehl und wird verwendet, um die Punktzahl des angegebenen Elements zu erhöhen.

Grammatik:

ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]

2.2 ZCARD und ZCOUNT

  • ZCARD : Ruft die Anzahl (Kardinalität) der Elemente in einer geordneten Menge ab.

    Grammatik:

    ZCARD key
    
  • ZCOUNT : Zählt die Anzahl der Elemente innerhalb eines angegebenen Bruchbereichs in einer geordneten Menge.

    Grammatik:

    ZCOUNT key min max
    

2.3 ZRANGE, ZREVRANGE und ZRANGEBYSCORE

  • ZRANGE : Gibt die Elemente innerhalb des angegebenen Indexbereichs in der geordneten Menge in aufsteigender Reihenfolge der Bewertungen zurück.

    Grammatik:

    ZRANGE key start stop [WITHSCORES]
    
  • ZREVRANGE : Gibt die Elemente innerhalb des angegebenen Indexbereichs in der geordneten Menge in absteigender Reihenfolge der Bewertungen zurück.

    Grammatik:

    ZREVRANGE key start stop [WITHSCORES]
    
  • ZRANGEBYSCORE : Gibt qualifizierte Elemente in einer geordneten Menge basierend auf dem Bewertungsbereich zurück.

    Grammatik:

    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
    

2.4 ZPOPMAX und ZPOPMIN, BZPOPMAX und BZPOPMIN

  • ZPOPMAX : Entfernt das Element mit der höchsten Punktzahl aus einer sortierten Menge und gibt es zurück.

  • ZPOPMIN : Entfernt das Element mit der niedrigsten Punktzahl aus einer sortierten Menge und gibt es zurück.

  • BZPOPMAX : Eine blockierende Version von ZPOPMAX, die wartet, wenn keine Elemente gepoppt werden können.

  • BZPOPMIN : Eine blockierende Version von ZPOPMIN, die wartet, wenn keine Elemente gepoppt werden können.

Syntax (ZPOPMAX und ZPOPMIN):

ZPOPMAX key [count]
ZPOPMIN key [count]

Syntax (BZPOPMAX und BZPOPMIN):

BZPOPMAX key [key ...] timeout
BZPOPMIN key [key ...] timeout

2.5 ZRANK, ZREVRANK, ZSCORE und ZINCRBY

  • ZRANK : Ruft die Rangfolge des angegebenen Elements in der geordneten Menge ab (sortiert von klein nach groß).

  • ZREVRANK : Ruft die Rangfolge des angegebenen Elements in der geordneten Menge ab (sortiert von groß nach klein).

  • ZSCORE : Ermitteln Sie die Punktzahl des angegebenen Elements in der geordneten Menge.

  • ZINCRBY : Erhöhen oder verringern Sie die Punktzahl des angegebenen Elements.

Syntax (ZRANK und ZREVRANK):

ZRANK key member
ZREVRANK key member

Syntax (ZSCORE):

ZSCORE key member

Syntax (ZINCRBY):

ZINCRBY key increment member

2.6 ZREM, ZREMRANGEBYRANK und ZREMRANGEBYSCORE

  • ZREM : Entfernt ein oder mehrere angegebene Elemente aus einer geordneten Menge.

  • ZREMRANGEBYRANK : Entfernt Elemente aus einer geordneten Menge basierend auf ihrem Rangbereich.

  • ZREMRANGEBYSCORE : Elemente aus einer geordneten Menge basierend auf dem Bewertungsbereich entfernen.

Syntax (ZREM):

ZREM key member [member ...]

Syntax (ZREMRANGEBYRANK):

ZREMRANGEBYRANK key start stop

Syntax (ZREMRANGEBYSCORE):

ZREMRANGEBYSCORE key min max

2.7 ZINTERSTORE 和 ZUNIONSTORE

  • ZINTERSTORE : Berechnet die Schnittmenge mehrerer sortierter Mengen und speichert das Ergebnis in einer neuen sortierten Menge.

  • ZUNIONSTORE : Berechnet die Vereinigung mehrerer sortierter Mengen und speichert das Ergebnis in einer neuen sortierten Menge.

Syntax (ZINTERSTORE):

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

Syntax (ZUNIONSTORE):

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

2.8 Zusammenfassung der ZSet-bezogenen Befehle

Das Folgende ist eine Zusammenfassung der Befehle im Zusammenhang mit dem ZSet-Typ, einschließlich Befehlen, Effekten und Zeitkomplexität:

Befehl Wirkung Zeitkomplexität
ZADD Fügen Sie Elemente und Brüche in einer geordneten Menge hinzu oder aktualisieren Sie sie O(log(N)*M) (N ist die Größe der sortierten Menge, M ist die Anzahl der hinzuzufügenden/aktualisierten Elemente)
ZCARD Ermitteln Sie die Anzahl der Elemente in einer sortierten Menge O(1)
ZCOUNT Zählt die Anzahl der Elemente in einer geordneten Menge innerhalb eines Bruchbereichs O(log(N))
ZRANGE Holen Sie sich die Elemente eines angegebenen Indexbereichs in einer geordneten Menge (aufsteigende Reihenfolge) O(log(N)+M) (N ist die Größe der sortierten Menge, M ist die Anzahl der zurückgegebenen Elemente)
ZREVRANGE Holen Sie sich die Elemente eines angegebenen Indexbereichs in einer geordneten Sammlung (absteigende Reihenfolge) O(log(N)+M) (N ist die Größe der sortierten Menge, M ist die Anzahl der zurückgegebenen Elemente)
ZRANGEBYSCORE Rufen Sie die Elemente in der sortierten Menge ab, die die Bedingungen für den Bewertungsbereich erfüllen O(log(N)+M) (N ist die Größe der sortierten Menge, M ist die Anzahl der zurückgegebenen Elemente)
ZPOPMAX Löst das Element mit der höchsten Punktzahl in einer sortierten Menge und gibt es zurück O(log(N))
ZPOPMIN Ruft das Element mit der niedrigsten Punktzahl in einer geordneten Menge auf und gibt es zurück O(log(N))
ZRANK Ruft die Rangfolge des angegebenen Elements in der sortierten Menge ab (aufsteigende Reihenfolge) O(log(N))
ZREVRANK Ruft die Rangfolge des angegebenen Elements in der sortierten Menge ab (absteigende Reihenfolge). O(log(N))
ZSCORE Ruft die Punktzahl eines angegebenen Elements in einer sortierten Menge ab O(1)
ZINCRBY Erhöhen oder verringern Sie die Punktzahl des angegebenen Elements O(log(N))
ZREM Entfernt das angegebene Element aus der sortierten Menge O(log(N)*M) (N ist die Größe der sortierten Menge, M ist die Anzahl der zu entfernenden Elemente)
ZREMRANGEBYRANK Entfernen Sie Elemente aus einer geordneten Menge basierend auf dem Rangbereich O(log(N)+M) (N ist die Größe der sortierten Menge, M ist die Anzahl der zu entfernenden Elemente)
ZREMRANGEBYSCORE Entfernen Sie Elemente aus einem geordneten Satz basierend auf dem Bewertungsbereich O(log(N)+M) (N ist die Größe der sortierten Menge, M ist die Anzahl der zu entfernenden Elemente)
ZINTERSTORE Berechnen Sie die Schnittmenge mehrerer sortierter Mengen und speichern Sie das Ergebnis O(N K)+O(M log(M)) (N ist die Anzahl der sortierten Eingabemengen, K ist die Größe der minimal sortierten Menge, M ist die Größe der sortierten Ausgabemenge)
ZUNIONSTORE Berechnen Sie die Vereinigung mehrerer sortierter Mengen und speichern Sie das Ergebnis O(N K)+O(M log(M)) (N ist die Anzahl der sortierten Eingabemengen, K ist die Größe der minimal sortierten Menge, M ist die Größe der sortierten Ausgabemenge)

ZSet (geordneter Satz) ist ein leistungsstarker und flexibler Datentyp in Redis. Er wird häufig in Szenarien verwendet, die eine Elementsortierung und einen Punkteabruf erfordern, wie z. B. Rankings, gewichtete Aufgabenwarteschlangen usw. Durch eine sinnvolle Auswahl von ZSet-Befehlen können diese Anwendungsszenarien effizient gehandhabt werden.

3. ZSet-Typkodierungsmethode

Der ZSet-Typ (Ordered Set) in Redis verwendet intern zwei Hauptcodierungsmethoden zum Speichern von Daten. Diese beiden Codierungsmethoden sind komprimierte Liste (ziplist) und Skiplist (skiplist).

3.1 Komprimierte Liste (ziplist)

Eine komprimierte Liste (Ziplist) ist eine kompakte Datenstruktur, die normalerweise zum Speichern geordneter Sammlungen mit weniger Elementen und kleineren Elementen verwendet wird. Komprimierte Listen speichern Daten in Form zusammenhängender Speicherblöcke. Jeder Knoten kann ein oder mehrere Elemente enthalten und verschiedene Arten von Elementen wie Ganzzahlen und Zeichenfolgen sehr kompakt speichern.

Zu den Funktionen komprimierter Listen gehören:

  • Kompaktheit : Komprimierte Listen sind kompakt im Speicher und eignen sich zum Speichern geordneter Mengen mit weniger Elementen.
  • Schneller Zugriff : Komprimierte Listen unterstützen den schnellen Zugriff auf Elemente per Index, da die Positionen der Elemente zusammenhängend sind.
  • Speichereinsparungen : Bei kleinen sortierten Sammlungen beanspruchen komprimierte Listen im Allgemeinen weniger Speicher als Sprunglisten.

3.2 Skiplist

Die Sprungliste ist eine auf einer verknüpften Liste basierende Datenstruktur, die normalerweise zum Speichern geordneter Sammlungen mit vielen Elementen und großen Elementen verwendet wird. Die Sprungtabelle verwendet mehrstufige Indizes, um den Suchvorgang von Elementen zu beschleunigen. Jede Ebene des Index enthält einen Teil der Elemente, wodurch die zeitliche Komplexität der Suche nach Elementen verringert wird.

Zu den Merkmalen von Skip-Tabellen gehören:

  • Schnelle Suche : Sprunglisten unterstützen die schnelle Elementsuche mit einer durchschnittlichen Zeitkomplexität von O(log N), wobei N die Anzahl der Elemente in der geordneten Menge ist.
  • Geeignet für große Datensätze : Bei geordneten Mengen mit einer großen Anzahl von Elementen sind Sprunglisten häufig effizienter als komprimierte Listen, da sie keine zusammenhängenden Speicherblöcke erfordern.
  • Belegt mehr Speicher : Skip-Tabellen belegen normalerweise mehr Speicher, da sie eine mehrstufige Indexstruktur beibehalten müssen.

Zusammenfassend lässt sich sagen, dass Redis basierend auf der Größe des geordneten Satzes und der Größe der Elemente automatisch eine komprimierte Liste oder eine Sprungtabelle für die Codierung verwendet, um Speichernutzung und Betriebseffizienz in Einklang zu bringen. Bei der Auswahl einer Kodierungsmethode müssen Sie die Größe der Daten und die Leistungsanforderungen des Vorgangs berücksichtigen.

4. ZSet-Nutzungsszenarien

Szenario: Ranking-System

Angenommen, Sie entwickeln eine soziale Plattform und müssen täglich ein Ranking der Benutzer-Likes führen. So verwenden Sie die geordnete Sammlung von Redis, um dieses Szenario zu implementieren:

  1. Fügen Sie Benutzer-Likes hinzu

    Wenn ein Benutzer einen Artikel veröffentlicht und Likes erhält, verwenden Sie ZADDden Befehl, um die Anzahl der Likes des Benutzers zur entsprechenden Rangliste hinzuzufügen, und verwenden Sie ZINCRBYden Befehl, um die Anzahl der Likes des Benutzers zu erhöhen.

    ZADD user:ranking:2022-03-15 3 james
    ZINCRBY user:ranking:2022-03-15 1 james
    

    Diese Befehle fügen die Anzahl der Likes für den Benutzer „James“ mit dem Datum „2022-03-15“ zur Bestenliste hinzu und erhöhen die Anzahl der Likes jedes Mal, wenn danach ein Like empfangen wird.

  2. Benutzer-Likes löschen

    Wenn Sie die „Gefällt mir“-Angaben eines Benutzers löschen müssen, weil sich der Benutzer beispielsweise abmeldet oder ein Verstoß vorliegt, können Sie ZREMden Benutzer mit dem Befehl aus der Bestenliste löschen.

    ZREM user:ranking:2022-03-15 tom
    

    Dieser Befehl entfernt den Benutzer „tom“ aus der Bestenliste.

  3. Zeigen Sie Benutzer mit den meisten Likes an

    Um die Benutzer mit den meisten Likes anzuzeigen, können Sie ZREVRANGEden Befehl verwenden, der die Top-N-Benutzer in der angegebenen Rangfolge zurückgibt.

    ZREVRANGE user:ranking:2022-03-15 0 9
    

    Dieser Befehl gibt die Top-10-Benutzer in der Rangliste mit dem Datum „2022-03-15“ zurück.

  4. Benutzerinformationen und Ergebnisse anzeigen

    Benutzerinformationen können in einem Hash-Typ gespeichert werden, wobei die Informationen jedes Benutzers den Benutzernamen als Schlüsselsuffix verwenden. Verwenden Sie HGETALLden Befehl, um die detaillierten Informationen des Benutzers abzurufen, und die Befehle ZSCOREund, ZRANKum die Punktzahl und das Ranking des Benutzers abzurufen.

    HGETALL user:info:james
    ZSCORE user:ranking:2022-03-15 mike
    ZRANK user:ranking:2022-03-15 mike
    

Durch diese Redis-Vorgänge können Sie ein vollständiges Ranking-System implementieren, um die Likes der Benutzer zu verfolgen, Likes zu löschen, Rankings anzuzeigen und Benutzerinformationen zu erhalten. Dies ist für Anwendungen wie soziale Plattformen und Nachrichten-Websites sehr hilfreich, um Echtzeit-Ranking und Benutzerinformationen bereitzustellen.

Guess you like

Origin blog.csdn.net/qq_61635026/article/details/132889201