I. Anwendungsszenarien für Redis-Datenstrukturen

Ich habe zuvor das Buch "redisbook" gelesen und bin bereits mit den grundlegenden Funktionen von Redis vertraut. Ich habe letzte Woche begonnen, den Quellcode von Redis zu lesen. Das aktuelle Ziel ist es, die Datenstrukturen von Redis gründlich zu verstehen. Wie wir alle wissen, gibt es in Redis insgesamt 5 Datenstrukturen. Was sind die Anwendungsszenarien für jede Datenstruktur?

  • String — Zeichenkette
  • Hash — Wörterbuch
  • List — Liste
  • Set — Menge
  • Sorted Set — sortierte Menge

Im Folgenden erklären wir kurz ihre jeweiligen Anwendungsszenarien:

1. String — Zeichenkette

Die String-Datenstruktur ist ein einfacher Schlüssel-Wert-Typ. Der Wert kann nicht nur ein String sein, sondern auch eine Zahl (wenn der numerische Typ durch Long dargestellt werden kann, ist die Kodierung integer; andernfalls wird er als String in sdshdr gespeichert). Mit dem String-Typ können Sie die aktuelle Funktionalität von Memcached mit höherer Effizienz vollständig implementieren. Sie können auch die geplante Persistenz von Redis (mit RDB-Modus oder AOF-Modus zur Auswahl), Operationsprotokolle, Replikation und andere Funktionen nutzen. Zusätzlich zu den gleichen Operationen get, set, incr, decr und anderen wie bei Memcached bietet Redis auch die folgenden Operationen:

  • LEN niushuai: O(1) Stringlänge abrufen
  • APPEND niushuai redis: Inhalt an den String anhängen, dabei wird eine intelligente Speicherzuweisung verwendet (jedes Mal 2x)
  • Ein Segment des Strings setzen und abrufen
  • Ein bestimmtes Bit des Strings setzen und abrufen
  • Stapelweises Setzen der Inhalte einer Reihe von Strings
  • Atomarer Zähler
  • Die clevere Verwendung des GETSET-Befehls: einen neuen Wert setzen und dabei den alten Wert löschen und ihn zusammen mit dem atomaren Zähler verwenden

2. Hash — Wörterbuch

In Memcached packen wir oft einige strukturierte Informationen in eine Hashmap, serialisieren sie auf der Client-Seite und speichern sie als String-Wert (normalerweise im JSON-Format), wie z. B. den Nicknamen, das Alter, das Geschlecht, die Punkte usw. eines Benutzers. Wenn man dann eines dieser Elemente ändern muss, muss man normalerweise den String (JSON) herausnehmen, ihn deserialisieren, den Wert dieses Elements ändern und ihn dann wieder in einen String (JSON) serialisieren und erneut speichern. Allein das Ändern eines Attributs erfordert so viele Schritte, was sicherlich sehr kostspielig ist und sich nicht für Situationen eignet, die gleichzeitige Operationen umfassen können (zum Beispiel, wenn zwei gleichzeitige Operationen beide die Punkte ändern müssen). Die Hash-Struktur von Redis erlaubt es jedoch, nur den Wert eines bestimmten Attributs zu ändern, genau wie das Aktualisieren eines Attributs in einer Datenbank.

  • Benutzerattribute speichern, lesen und ändern

3. List — Liste

Die List ist, offen gesagt, eine verkettete Liste (Redis implementiert List mithilfe einer doppelt verketteten Liste). Jeder, der Datenstrukturen gelernt hat, sollte ihre Struktur verstehen können. Mit der List-Struktur können wir problemlos Funktionen wie das Ranking der neuesten Nachrichten implementieren (zum Beispiel Sina Weibos TimeLine). Eine weitere Anwendung von List ist die als Nachrichtenwarteschlange: Man kann die *PUSH-Operationen von List verwenden, um Aufgaben in einer List zu speichern, und dann entnehmen Worker-Threads die Aufgaben mit POP-Operationen zur Ausführung. Redis bietet außerdem eine API zum Arbeiten mit einem Segment von Elementen in einer List, sodass man ein Segment von Elementen in der List direkt abfragen oder löschen kann.

  • Weibo TimeLine
  • Nachrichtenwarteschlange

4. Set — Menge

Ein Set ist eine Sammlung; das Konzept einer Sammlung ist eine Kombination aus einer Reihe nicht wiederholter Werte. Mit der von Redis bereitgestellten Set-Datenstruktur können Sie sammlungsartige Daten speichern. In einer Weibo-Anwendung können Sie beispielsweise alle Benutzer, denen ein Benutzer folgt, in einem Set speichern und alle seine Fans in einem anderen Set speichern. Da Redis auf sehr benutzerfreundliche Weise Operationen wie Schnittmenge, Vereinigung und Differenz für Sets bereitstellt, können Sie Funktionen wie gegenseitiges Folgen, gemeinsame Interessen und Freunde zweiten Grades sehr bequem implementieren. Für alle oben genannten Set-Operationen können Sie außerdem verschiedene Befehle verwenden, um auszuwählen, ob das Ergebnis an den Client zurückgegeben oder in einem neuen Set gespeichert wird.

  • Gemeinsame Freunde, Freunde zweiten Grades
  • Mithilfe der Eindeutigkeit können Sie alle eindeutigen IPs zählen, die die Website besuchen
  • Bei der Empfehlung von Freunden die Schnittmenge anhand von Tags ermitteln; wenn sie größer als ein bestimmter Schwellenwert ist, können Sie eine Empfehlung aussprechen

5. Sorted Set — sortiertes Set

Im Vergleich zu Sets fügen Sorted Sets den Elementen in einem Set einen Gewichtungsparameter namens score hinzu, sodass die Elemente im Set nach score geordnet werden können. In einem Sorted Set, das die Punktzahlen aller Mitschüler speichert, kann der Set-Wert beispielsweise die Studenten-ID sein und der Score ihre Prüfungspunktzahl. Auf diese Weise sind die Daten beim Einfügen in das Set bereits natürlich sortiert. Darüber hinaus können Sorted Sets als gewichtete Warteschlange verwendet werden. Beispielsweise haben normale Nachrichten einen Score von 1 und wichtige Nachrichten einen Score von 2; dann können Worker-Threads Arbeitsaufgaben in absteigender Reihenfolge des Scores abrufen, sodass wichtige Aufgaben zuerst ausgeführt werden.

  • Elemente mit Gewichtungen, wie z. B. eine Bestenliste der Benutzerpunktzahlen in einem Spiel
  • Eine relativ komplexe Datenstruktur, die im Allgemeinen nicht in allzu vielen Szenarien verwendet wird

II. Weitere Nutzungsszenarien für Redis-Funktionen

1. Publish-Subscribe-System

Pub/Sub, wörtlich verstanden, bedeutet Veröffentlichen (Publish) und Abonnieren (Subscribe). In Redis kann man Nachrichtenveröffentlichung und Nachrichtenabonnement für einen bestimmten Key einrichten. Wenn eine Nachricht auf einem Key veröffentlicht wird, erhalten alle darauf abonnierten Clients die entsprechende Nachricht. Der offensichtlichste Nutzen dieser Funktion ist ein Echtzeit-Nachrichtensystem, wie gewöhnliches Instant Messaging, Gruppenchat und andere Funktionen.

2. Transaktionen

Wer sagt, dass NoSQL keine Transaktionen unterstützt? Obwohl die Transaktionen von Redis keine strikten ACID-Transaktionen bieten (zum Beispiel, wenn eine Reihe von Befehlen, die über EXEC zur Ausführung übergeben wird, während der Ausführung einen Serverabsturz verursacht, dann sind einige der Befehle bereits ausgeführt worden und die übrigen nicht), bieten die Transaktionen dennoch die grundlegende Funktion, Befehle zur Ausführung zu bündeln (wenn der Server keine Probleme hat, kann garantiert werden, dass eine Reihe von Befehlen sequenziell zusammen ausgeführt wird und keine anderen Client-Befehle dazwischen eingefügt werden). Redis bietet außerdem eine Watch-Funktion: Man kann einen Key mit Watch überwachen und dann Transaktionen ausführen. Wenn während dieses Prozesses der überwachte Wert geändert wird, erkennen die Transaktionen dies und verweigern die Ausführung.