348 Stimmen

Welche Datenstrukturen werden für Redis verwendet?

Ich versuche, zwei Fragen in einer endgültigen Liste zu beantworten:

  1. Welche Datenstrukturen werden für Redis verwendet?
  2. Und was sind die wichtigsten Vorteile/Nachteile/Verwendungsfälle für jeden Typ?

Also, ich habe gelesen, die Redis-Listen sind eigentlich mit verknüpften Listen implementiert. Aber für andere Typen, bin ich nicht in der Lage, alle Informationen zu graben. Wenn jemand über diese Frage stolpert und keine Zusammenfassung der Vor- und Nachteile der Änderung oder des Zugriffs auf verschiedene Datenstrukturen hat, hätte er eine vollständige Liste von wann man bestimmte Typen am besten einsetzt auch zu referenzieren.

Konkret möchte ich alle Typen umreißen: string, list, set, zset und hash.

Oh, ich habe mir bisher unter anderem diese Artikel angesehen:

651voto

antirez Punkte 17886

Ich werde versuchen, Ihre Frage zu beantworten, aber ich fange mit etwas an, das auf den ersten Blick seltsam erscheinen mag: Wenn Sie nicht an Redis-Interna interessiert sind, müssen Sie sollte sich nicht kümmern darüber, wie Datentypen intern implementiert werden. Das hat einen einfachen Grund: Für jede Redis-Operation finden Sie die Zeitkomplexität in der Dokumentation, und wenn Sie die Menge der Operationen und die Zeitkomplexität haben, brauchen Sie nur noch einen Anhaltspunkt für die Speichernutzung (und da wir viele Optimierungen vornehmen, die je nach Daten variieren können, ist der beste Weg, diese Zahlen zu erhalten, ein paar triviale Praxistests durchzuführen).

Aber da Sie gefragt haben, hier ist die zugrunde liegende Implementierung jedes Redis-Datentyps.

  • Streicher sind mit einer dynamischen C-String-Bibliothek implementiert, so dass wir (asymptotisch gesprochen) nicht für Zuweisungen bei Anfügeoperationen zahlen. Auf diese Weise haben wir z. B. O(N)-Anhängungen, anstatt ein quadratisches Verhalten zu haben.
  • Verzeichnisse sind mit verknüpften Listen implementiert.
  • Sätze y Hashes werden mit Hash-Tabellen umgesetzt.
  • Sortierte Sets werden implementiert mit Überspringungslisten (eine besondere Art von ausgeglichenen Bäumen).

Wenn jedoch Listen, Mengen und sortierte Mengen eine geringe Anzahl von Elementen und eine geringe Größe der größten Werte aufweisen, wird eine andere, viel kompaktere Kodierung verwendet. Diese Kodierung unterscheidet sich für verschiedene Typen, hat aber die Eigenschaft, dass es sich um einen kompakten Datenblock handelt, der oft eine O(N)-Überprüfung für jede Operation erzwingt. Da wir dieses Format nur für kleine Objekte verwenden, stellt dies kein Problem dar; das Scannen eines kleinen O(N)-Blob ist Cache vergessend Praktisch gesehen ist es also sehr schnell, und wenn es zu viele Elemente gibt, wird die Kodierung automatisch auf die native Kodierung umgestellt (verknüpfte Liste, Hash usw.).

Aber Ihre Frage bezog sich nicht nur auf Interna, sondern auf Folgendes Welcher Typ ist wofür zu verwenden? .

Streicher

Dies ist der Basistyp für alle Typen. Er ist einer der vier Typen, aber auch der Basistyp der komplexen Typen, denn eine Liste ist eine Liste von Zeichenketten, ein Set ist eine Menge von Zeichenketten und so weiter.

Ein Redis-String ist eine gute Idee für alle offensichtlichen Szenarien, in denen Sie eine HTML-Seite speichern wollen, aber auch, wenn Sie die Konvertierung Ihrer bereits kodierten Daten vermeiden wollen. Wenn Sie zum Beispiel JSON oder MessagePack haben, können Sie Objekte einfach als Strings speichern. In Redis 2.6 können Sie diese Art von Objekten sogar serverseitig mit Lua-Skripten manipulieren.

Eine weitere interessante Verwendung von Strings sind Bitmaps und im Allgemeinen Arrays mit zufälligem Zugriff auf Bytes, da Redis Befehle für den Zugriff auf zufällige Bereiche von Bytes oder sogar einzelne Bits exportiert. Zum Beispiel prüfen diesen guten Blogbeitrag: Schnelle und einfache Echtzeit-Metriken mit Redis .

Verzeichnisse

Listen eignen sich gut, wenn Sie wahrscheinlich nur die äußersten Enden der Liste berühren: nahe am Ende oder nahe am Anfang. Listen sind nicht sehr gut geeignet, um Dinge zu paginieren, weil der Zufallszugriff langsam ist, O(N). Gute Verwendungen von Listen sind also einfache Warteschlangen und Stapel oder die Verarbeitung von Elementen in einer Schleife mit RPOPLPUSH mit gleicher Quelle und gleichem Ziel, um einen Ring von Elementen zu "drehen".

Listen sind auch gut geeignet, wenn wir nur eine begrenzte Sammlung von N Elementen erstellen wollen, wobei in der Regel Wir greifen nur auf die obersten oder untersten Elemente zu, oder wenn N klein ist.

Sätze

Sets sind eine ungeordnete Datensammlung und eignen sich daher immer dann, wenn Sie eine Sammlung von Elementen haben und es sehr wichtig ist, das Vorhandensein oder die Größe der Sammlung auf eine sehr schnelle Weise zu überprüfen. Ein weiterer Vorteil von Sets ist die Unterstützung für das Peeken oder Popping von Zufallselementen (Befehle SRANDMEMBER und SPOP).

Mengen sind auch gut geeignet, um Beziehungen darzustellen, z. B. "Was sind Freunde von Benutzer X?" usw. Aber andere gute Datenstrukturen für diese Art von Dingen sind sortierte Mengen, wie wir sehen werden.

Sets unterstützen komplexe Operationen wie Überschneidungen, Vereinigungen und so weiter, so dass dies eine gute Datenstruktur für die Verwendung von Redis in einer "rechnerischen" Art und Weise ist, wenn Sie Daten haben und Sie Transformationen auf diesen Daten durchführen möchten, um eine Ausgabe zu erhalten.

Kleine Mengen werden auf sehr effiziente Weise kodiert.

Hashes

Hashes sind die perfekte Datenstruktur zur Darstellung von Objekten, die aus Feldern und Werten bestehen. Felder von Hashes können mit HINCRBY auch atomar inkrementiert werden. Wenn Sie Objekte wie Benutzer, Blogeinträge oder eine andere Art von Artikel Wenn Sie nicht Ihre eigene Kodierung wie JSON oder ähnliches verwenden wollen, sind Hashes wahrscheinlich die beste Lösung.

Beachten Sie jedoch, dass kleine Hashes von Redis sehr effizient kodiert werden, und Sie können Redis bitten, einzelne Felder sehr schnell atomar zu GET, SET oder zu inkrementieren.

Hashes können auch verwendet werden, um verknüpfte Datenstrukturen mit Hilfe von Referenzen darzustellen. Sehen Sie sich zum Beispiel die lamernews.com-Implementierung von Kommentaren an.

Sortierte Sets

Sortierte Mengen sind die die einzigen anderen Datenstrukturen neben Listen, die geordnete Elemente enthalten . Mit sortierten Sets kann man eine Reihe von coolen Sachen machen. Zum Beispiel können Sie alle Arten von Top Etwas Listen in Ihrer Webanwendung. Top-Benutzer nach Punktestand, Top-Beiträge nach Seitenaufrufen, Top was auch immer, aber eine einzige Redis-Instanz wird Tonnen von Einfüge- und Get-Top-Elemente-Operationen pro Sekunde unterstützen.

Sortierte Mengen können wie normale Mengen verwendet werden, um Beziehungen zu beschreiben, aber sie ermöglichen es auch, die Liste der Elemente zu paginieren und sich die Reihenfolge zu merken. Wenn ich mir zum Beispiel die Freunde von Benutzer X mit einer sortierten Menge merke, kann ich sie mir leicht in der Reihenfolge der akzeptierten Freundschaft merken.

Sortierte Sätze sind gut für Prioritätswarteschlangen geeignet.

Sortierte Mengen sind wie leistungsfähigere Listen, bei denen das Einfügen, Entfernen oder Abrufen von Bereichen aus der Mitte der Liste immer schnell geht. Sie benötigen jedoch mehr Speicher und sind O(log(N))-Datenstrukturen.

Schlussfolgerung

Ich hoffe, dass ich in diesem Beitrag einige Informationen geliefert habe, aber es ist viel besser, den Quellcode von lamernews von http://github.com/antirez/lamernews und verstehen, wie es funktioniert. Viele Datenstrukturen von Redis werden in Lamer News verwendet, und es gibt viele Hinweise darauf, was zur Lösung einer bestimmten Aufgabe zu verwenden ist.

Sorry für die Grammatik Tippfehler, es ist Mitternacht hier und zu müde, um den Beitrag zu überprüfen ;)

90voto

Sripathi Krishnan Punkte 30024

In den meisten Fällen müssen Sie die zugrundeliegenden Datenstrukturen, die von Redis verwendet werden, nicht verstehen. Aber ein wenig Wissen hilft Ihnen bei der Abwägung zwischen CPU und Speicher. Außerdem hilft es Ihnen, Ihre Daten auf effiziente Weise zu modellieren.

Intern verwendet Redis die folgenden Datenstrukturen:

  1. Zeichenfolge
  2. Wörterbuch
  3. Doppelt verknüpfte Liste
  4. Liste überspringen
  5. Zip-Liste
  6. Int-Sätze
  7. Zip Maps (seit Redis 2.6 veraltet zugunsten von Zip-Listen)

Um die von einem bestimmten Schlüssel verwendete Kodierung zu ermitteln, verwenden Sie den Befehl object encoding <key> .

1. Streicher

In Redis werden die Strings als Einfache dynamische Zeichenketten (SDS) . Es ist eine kleine Hülle über einer char * die es Ihnen ermöglicht, die Länge der Zeichenkette und die Anzahl der freien Bytes als Präfix zu speichern.

Denn die Länge der Zeichenkette wird gespeichert, strlen ist eine O(1)-Operation. Da die Länge bekannt ist, sind Redis-Zeichenfolgen auch binär sicher. Es ist völlig legal, dass eine Zeichenkette die Nullzeichen .

Strings sind die vielseitigste Datenstruktur, die in Redis verfügbar ist. Ein String ist todos der folgenden Punkte:

  1. Eine Zeichenkette, die Text speichern kann. Siehe SETZEN y GET Befehle.
  2. Ein Byte-Array, das binäre Daten speichern kann.
  3. A long die Zahlen speichern können. Siehe INCR , DECR , INCRBY y DECRBY Befehle.
  4. Ein Array (von chars , ints , longs oder jeden anderen Datentyp), die einen effizienten Zufallszugriff ermöglichen. Siehe SETRANGE y GETRANGE Befehle.
  5. A Bitfeld mit der Sie einzelne Bits setzen oder abrufen können. Siehe SETBIT y GETBIT Befehle.
  6. Ein Speicherblock, den Sie zum Aufbau anderer Datenstrukturen verwenden können. Dies wird intern verwendet, um ziplists und intsets zu erstellen, die kompakte, speichereffiziente Datenstrukturen für eine kleine Anzahl von Elementen sind. Mehr dazu weiter unten.

2. Wörterbuch

Redis verwendet eine Wörterbuch für das Folgende:

  1. Zuordnen eines Schlüssels zu seinem zugehörigen Wert, wobei der Wert eine Zeichenkette, ein Hash, eine Menge, eine sortierte Menge oder eine Liste sein kann.
  2. Zuordnen eines Schlüssels zu seinem Verfallszeitstempel.
  3. Implementierung der Datentypen Hash, Set und Sorted Set.
  4. Um Redis-Befehle den Funktionen zuzuordnen, die diese Befehle verarbeiten.
  5. Um einen Redis-Schlüssel einer Liste von Clients zuzuordnen, die für diesen Schlüssel gesperrt sind. Siehe BLPOP .

Redis Dictionaries sind implementiert mit Hash-Tabellen . Anstatt die Implementierung zu erklären, werde ich nur die Redis-spezifischen Dinge erklären:

  1. Wörterbücher verwenden eine Struktur namens dictType um das Verhalten einer Hashtabelle zu erweitern. Diese Struktur hat Funktionszeiger, so dass die folgenden Operationen erweiterbar sind: a) Hash-Funktion, b) Schlüsselvergleich, c) Schlüssel-Destruktor und d) Wert-Destruktor.
  2. Wörterbücher verwenden die murmelnd2 . (Zuvor verwendeten sie die djb2-Hash-Funktion mit seed=5381, aber dann wird die Hash-Funktion wurde auf murmur2 umgestellt . Siehe diese Frage für eine Erklärung des djb2-Hash-Algorithmus .)
  3. Redis verwendet Incremental Hashing, auch bekannt als Inkrementelle Größenanpassung . Das Wörterbuch hat zwei Hash-Tabellen. Jedes Mal, wenn das Wörterbuch berührt wird ein Bereich von der ersten (kleineren) Hashtabelle in die zweite verschoben. Auf diese Weise verhindert Redis einen teuren Größenänderungsvorgang.

En Set Datenstruktur verwendet ein Dictionary, um sicherzustellen, dass es keine Duplikate gibt. Die Sorted Set verwendet ein Wörterbuch, um ein Element seinem Wert zuzuordnen, weshalb ZSCORE ist eine O(1)-Operation.

3. Doppelt verknüpfte Listen

En list Datentyp ist implementiert mit Doppelt verknüpfte Listen . Die Implementierung von Redis ist direkt aus dem Algorithmus-Lehrbuch. Die einzige Änderung besteht darin, dass Redis die Länge in der Listendatenstruktur speichert. Dadurch wird sichergestellt, dass LLEN hat O(1) Komplexität.

4. Listen überspringen

Redis verwendet Listen überspringen als zugrundeliegende Datenstruktur für sortierte Gruppen. Wikipedia hat eine gute Einführung. William Pughs Papier Listen überspringen: Eine wahrscheinlichkeitstheoretische Alternative zu Balanced Trees enthält weitere Einzelheiten.

Sortierte Gruppen verwenden sowohl eine Verzweigungsliste als auch ein Wörterbuch. Das Wörterbuch speichert die Punktzahl der einzelnen Elemente.

Die Skip-List-Implementierung von Redis unterscheidet sich in folgenden Punkten von der Standardimplementierung:

  1. Redis erlaubt doppelte Spielstände. Wenn zwei Knoten die gleiche Punktzahl haben, werden sie nach dem lexikographische Ordnung .
  2. Jeder Knoten hat einen Rückwärtszeiger auf Ebene 0. Damit können Sie die Elemente in umgekehrter Reihenfolge der Punktzahl durchlaufen.

5. Zip-Liste

Eine Zip-Liste ist wie eine doppelt verknüpfte Liste, nur dass sie keine Zeiger verwendet und die Daten inline speichert.

Jeder Knoten in einer doppelt verknüpften Liste hat drei Zeiger - einen Vorwärtszeiger, einen Rückwärtszeiger und einen Zeiger, der auf die an diesem Knoten gespeicherten Daten verweist. Zeiger benötigen Speicher (8 Byte auf einem 64-Bit-System), und daher ist eine doppelt verkettete Liste für kleine Listen sehr ineffizient.

Eine Zip-Liste speichert Elemente sequentiell in einem Redis-String. Jedes Element hat einen kleinen Header, der die Länge und den Datentyp des Elements, den Offset zum nächsten Element und den Offset zum vorherigen Element speichert. Diese Offsets ersetzen die Vorwärts- und Rückwärtszeiger. Da die Daten inline gespeichert werden, benötigen wir keinen Datenzeiger.

Die Zip-Liste wird zum Speichern kleiner Listen, sortierter Mengen und Hashes verwendet. Sortierte Mengen werden in eine Liste geflattet wie [element1, score1, element2, score2, element3, score3] und in der Zip-Liste gespeichert. Hashes werden in eine Liste umgewandelt wie [key1, value1, key2, value2] usw.

Mit Zip Lists haben Sie die Möglichkeit, einen Kompromiss zwischen CPU und Speicher zu finden. Zip-Listen sind speichereffizient, verbrauchen aber mehr CPU als eine verknüpfte Liste (oder Hash-Tabelle/Skip-Liste). Die Suche nach einem Element in einer Zip-Liste ist O(n). Das Einfügen eines neuen Elements erfordert eine Neuzuweisung von Speicher. Aus diesem Grund verwendet Redis diese Kodierung nur für kleine Listen, Hashes und sortierte Mengen. Sie können dieses Verhalten durch Ändern der Werte von <datatype>-max-ziplist-entries y <datatype>-max-ziplist-value> in redis.conf. Siehe Redis-Speicheroptimierung, Abschnitt "Spezielle Kodierung von kleinen Aggregat-Datentypen" für weitere Informationen.

En Kommentare zu ziplist.c sind hervorragend, und Sie können diese Datenstruktur vollständig verstehen, ohne den Code lesen zu müssen.

6. Int-Sätze

Int Sets sind ein schicker Name für "Sorted Integer Arrays".

In Redis werden Sets in der Regel mit Hash-Tabellen implementiert. Für kleine Mengen ist eine Hash-Tabelle speichertechnisch ineffizient. Wenn die Menge nur aus ganzen Zahlen besteht, ist ein Array oft effizienter.

Ein Int Set ist eine sortierte Reihe von Ganzzahlen. Um ein Element a zu finden binärer Suchalgorithmus verwendet wird. Dies hat eine Komplexität von O(log N). Das Hinzufügen neuer Ganzzahlen zu diesem Array kann eine Neuzuweisung von Speicher erfordern, was bei großen Ganzzahl-Arrays teuer werden kann.

Als weitere Speicheroptimierung gibt es Int Sets in 3 Varianten mit unterschiedlichen Integer-Größen: 16 Bit, 32 Bit und 64 Bit. Redis ist intelligent genug, um je nach Größe der Elemente die richtige Variante zu verwenden. Wenn ein neues Element hinzugefügt wird und die aktuelle Größe überschreitet, migriert Redis es automatisch zur nächsten Größe. Wird eine Zeichenkette hinzugefügt, wandelt Redis das Int Set automatisch in ein reguläres Hash Table basiertes Set um.

Int-Sets sind ein Kompromiss zwischen CPU und Speicher. Int-Sets sind extrem speichereffizient, und für kleine Sets sind sie schneller als eine Hash-Tabelle. Aber ab einer bestimmten Anzahl von Elementen werden die O(log N)-Abrufzeit und die Kosten für die Neuzuweisung von Speicher zu hoch. Auf der Grundlage von Experimenten wurde festgestellt, dass der optimale Schwellenwert für den Wechsel zu einer regulären Hash-Tabelle bei 512 liegt. Sie können diesen Schwellenwert jedoch je nach den Bedürfnissen Ihrer Anwendung erhöhen (und verringern, wenn es keinen Sinn macht). Siehe set-max-intset-entries in redis.conf.

7. Zip-Karten

Zip Maps sind Wörterbücher, die in einer Liste gespeichert sind. Sie sind den Zip-Listen sehr ähnlich.

Zip Maps sind seit Redis 2.6 veraltet, und kleine Hashes werden in Zip Lists gespeichert. Um mehr über diese Kodierung zu erfahren, lesen Sie die Kommentare in zipmap.c .

4voto

Shrikant Punkte 353

Redis speichert Schlüssel, die auf Werte verweisen. Schlüssel können beliebige Binärwerte bis zu einer angemessenen Größe sein (die Verwendung kurzer ASCII-Zeichenfolgen wird aus Gründen der Lesbarkeit und zu Debugging-Zwecken empfohlen). Werte sind einer der fünf nativen Redis-Datentypen.

1.strings - eine Folge von binären sicheren Bytes bis zu 512 MB

2.hashes - eine Sammlung von Schlüssel-Wert-Paaren

3.lists - eine Sammlung von Zeichenketten in Einfügereihenfolge

4.sets - eine Sammlung von eindeutigen Zeichenketten ohne Reihenfolge

5. sortierte Mengen - eine Sammlung eindeutiger Zeichenfolgen, die nach einer benutzerdefinierten Bewertung geordnet sind

Streicher

Ein Redis-String ist eine Folge von Bytes.

Strings in Redis sind binärsicher (d.h. sie haben eine bekannte Länge, die nicht durch spezielle Abschlusszeichen bestimmt wird), so dass Sie alles bis zu 512 Megabyte in einem String speichern können.

Strings sind das kanonische "Schlüssel-Wert-Speicher"-Konzept. Sie haben einen Schlüssel, der auf einen Wert zeigt, wobei sowohl Schlüssel als auch Wert Text oder binäre Zeichenketten sind.

Für alle möglichen Operationen auf Zeichenketten, siehe die http://redis.io/commands/#string

Hashes

Ein Redis-Hash ist eine Sammlung von Schlüssel-Wert-Paaren.

Ein Redis-Hash enthält viele Schlüssel-Wert-Paare, wobei jeder Schlüssel und Wert eine Zeichenkette ist. Redis-Hashes unterstützen keine komplexen Werte direkt (d.h. ein Hash-Feld kann nicht den Wert einer Liste, eines Sets oder eines anderen Hashes haben), aber Sie können Hash-Felder verwenden, um auf andere komplexe Werte der höchsten Ebene zu verweisen. Die einzige spezielle Operation, die Sie mit Hash-Feld-Werten durchführen können, ist das atomare Inkrementieren/Dekrementieren von numerischen Inhalten.

Man kann sich Redis-Hashes auf zwei Arten vorstellen: als direkte Objektdarstellung und als eine Möglichkeit, viele kleine Werte kompakt zu speichern.

Direkte Objektdarstellungen sind einfach zu verstehen. Objekte haben einen Namen (den Schlüssel des Hashes) und eine Sammlung von internen Schlüsseln mit Werten. Das folgende Beispiel ist ein Beispiel dafür.

Die Speicherung vieler kleiner Werte mit einem Hash ist eine clevere Redis-Massenspeichertechnik. Wenn ein Hash eine kleine Anzahl von Feldern hat (~100), optimiert Redis die Speicher- und Zugriffseffizienz des gesamten Hash. Die Redis-Speicheroptimierung für kleine Hashes führt zu einem interessanten Verhalten: Es ist effizienter, 100 Hashes mit jeweils 100 internen Schlüsseln und Werten zu haben, als 10.000 Top-Level-Schlüssel, die auf String-Werte zeigen. Die Verwendung von Redis-Hashes zur Optimierung der Datenspeicherung auf diese Weise erfordert zusätzlichen Programmieraufwand für die Nachverfolgung, wo die Daten am Ende landen, aber wenn Ihre Datenspeicherung in erster Linie auf Strings basiert, können Sie mit diesem seltsamen Trick eine Menge Speicher-Overhead sparen.

Für alle möglichen Operationen mit Hashes, siehe die Hash-Dokumente

Verzeichnisse

Redis-Listen verhalten sich wie verknüpfte Listen.

Sie können Listen entweder vom Kopf oder vom Ende einer Liste aus einfügen, löschen und durchlaufen.

Verwenden Sie Listen, wenn Sie die Werte in der Reihenfolge, in der sie eingefügt wurden, beibehalten wollen. (Redis gibt Ihnen die Möglichkeit, bei Bedarf an jeder beliebigen Listenposition einzufügen, aber Ihre Einfügeleistung wird sich verschlechtern, wenn Sie weit von Ihrer Startposition entfernt einfügen).

Redis-Listen werden häufig als Producer/Consumer-Warteschlangen verwendet. Fügen Sie Elemente in eine Liste ein und entfernen Sie dann Elemente aus der Liste. Was passiert, wenn Ihre Konsumenten versuchen, aus einer Liste ohne Elemente zu posten? Sie können Redis bitten, auf das Erscheinen eines Elements zu warten und es Ihnen sofort zurückzugeben, wenn es hinzugefügt wird. Dies macht Redis zu einer Echtzeit-Warteschlange/einem Ereignis/einem Job/einer Aufgabe/einem Benachrichtigungssystem.

Sie können atomar Elemente von beiden Enden einer Liste entfernen, so dass jede Liste wie ein Stapel oder eine Warteschlange behandelt werden kann.

Sie können auch Listen mit fester Länge (Capped Collections) pflegen, indem Sie Ihre Liste nach jedem Einfügen auf eine bestimmte Größe trimmen.

Für alle möglichen Operationen auf Listen, siehe die listet Dokumente

Sätze

Redis-Sets sind, nun ja, Sets.

Ein Redis-Set enthält eindeutige, ungeordnete Redis-Strings, wobei jeder String nur einmal pro Set existiert. Wenn Sie das gleiche Element zehnmal zu einem Set hinzufügen, wird es nur einmal angezeigt. Sets eignen sich hervorragend, um sicherzustellen, dass etwas mindestens einmal vorhanden ist, ohne sich Gedanken über doppelte Elemente zu machen, die sich ansammeln und Platz verschwenden. Sie können dieselbe Zeichenfolge beliebig oft hinzufügen, ohne prüfen zu müssen, ob sie bereits vorhanden ist.

Mengen sind schnell für die Überprüfung der Mitgliedschaft, das Einfügen und Löschen von Mitgliedern in der Menge.

Mengen haben, wie zu erwarten, effiziente Mengenoperationen. Sie können die Vereinigung, die Schnittmenge und die Differenz mehrerer Mengen auf einmal ermitteln. Die Ergebnisse können entweder an den Aufrufer zurückgegeben oder in einer neuen Menge zur späteren Verwendung gespeichert werden.

Mengen haben konstanten Zeitzugriff für Zugehörigkeitsprüfungen (im Gegensatz zu Listen), und Redis hat sogar bequeme zufällige Mitgliederentnahme und -rückgabe ("pop a random element from the set") oder zufällige Mitgliederrückgabe ohne Ersatz ("give me 30 random-ish unique users") oder mit Ersatz ("give me 7 cards, but after each selection, put the card back so it can potentially be samplified again").

Für alle möglichen Operationen auf Mengen siehe die setzt Dokumente .

Sortierte Sets

Sortierte Redis-Sets sind Sets mit einer benutzerdefinierten Reihenfolge.

Der Einfachheit halber können Sie sich eine sortierte Menge als einen binären Baum mit eindeutigen Elementen vorstellen. (Redis sortierte Mengen sind eigentlich Überspringungslisten .) Die Sortierreihenfolge der Elemente wird durch die Punktzahl der einzelnen Elemente bestimmt.

Sortierte Mengen sind immer noch Mengen. Elemente dürfen nur einmal in einer Menge vorkommen. Ein Element wird für die Zwecke der Eindeutigkeit durch seinen Zeichenfolgeninhalt definiert. Das Einfügen des Elements "Apfel" mit der Sortierkennzahl 3 und das anschließende Einfügen des Elements "Apfel" mit der Sortierkennzahl 500 führt zu einem Element "Apfel" mit der Sortierkennzahl 500 in Ihrer sortierten Menge. Gruppen sind nur auf der Grundlage von Daten eindeutig, nicht auf der Grundlage von (Punktzahl, Daten) Paaren.

Vergewissern Sie sich, dass Ihr Datenmodell sich auf den Inhalt der Zeichenkette stützt und nicht auf den Wert des Elements für die Eindeutigkeit. Punktzahlen dürfen wiederholt werden (oder sogar Null sein), aber, ein letztes Mal, Set-Elemente können nur einmal pro sortiertem Set existieren. Wenn Sie zum Beispiel versuchen, den Verlauf jeder Benutzeranmeldung als sortierte Menge zu speichern, indem Sie die Punktzahl zur Epoche der Anmeldung und den Wert zur Benutzerkennung machen, werden Sie am Ende nur die letzte Anmeldeepoche für alle Ihre Benutzer speichern. Ihre Menge würde auf die Größe Ihrer Benutzerbasis anwachsen und nicht auf die gewünschte Größe der Benutzerbasis * Anmeldungen.

Die Elemente werden mit Noten zu Ihrem Set hinzugefügt. Sie können die Punktzahl eines jeden Elements jederzeit aktualisieren, indem Sie das Element einfach mit einer neuen Punktzahl hinzufügen. Die Punktzahlen werden durch Fließkommadoppelwerte dargestellt, so dass Sie bei Bedarf die Granularität von hochgenauen Zeitstempeln angeben können. Mehrere Elemente können denselben Punktestand haben.

Sie können Elemente auf verschiedene Weise abrufen. Da alles sortiert ist, können Sie nach Elementen fragen, die mit den niedrigsten Werten beginnen. Sie können nach Elementen fragen, die mit den höchsten Punktzahlen beginnen ("in reverse"). Sie können die Elemente nach ihrem Sortierergebnis entweder in natürlicher oder in umgekehrter Reihenfolge abfragen.

Für alle möglichen Operationen auf sortierten Mengen siehe die sortierte Sätze Dokumente.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X