Heim >Datenbank >Redis >Fassen Sie Redis-Datentypen und Nutzungsszenarien zusammen

Fassen Sie Redis-Datentypen und Nutzungsszenarien zusammen

WBOY
WBOYnach vorne
2022-02-28 17:19:491903Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Datentypen in Redis. Er stellt hauptsächlich Probleme im Zusammenhang mit allgemeinen Datentyp-Nutzungsszenarien vor.

Fassen Sie Redis-Datentypen und Nutzungsszenarien zusammen

Empfohlenes Lernen: Redis-Lerntutorial

Redis-Datentypen und Nutzungsszenarien

  • Redis-Datentypen und Nutzungsszenarien
    Im Vergleich zu anderen KV-Datenbanken ist es eines der Hauptmerkmale von Redis unterstützt umfangreiche Datentypen. Es unterstützt insgesamt 5 Datentypen. Diese 5 Datentypen, ihre Verwendungsszenarien und ihre interne Implementierung werden im Folgenden einzeln vorgestellt.

  • string
    Einführung: Der String-Typ ist der grundlegendste Datentyp in Redis, der am häufigsten verwendete Datentyp und wird von vielen Spielern sogar als einziger Datentyp von Redis verwendet. Der String-Typ ist in Redis binärsicher, was bedeutet, dass der String-Wert sich um den Binär-String und nicht um das spezifische Format kümmert. Sie können ihn zum Speichern von Strings im JSON-Format oder JPEG-Bildformat verwenden.

  • Ermitteln Sie die Länge der Zeichenfolge.

  • Fügen Sie Inhalt an die Zeichenfolge an der Inhalt einer Reihe von Zeichenfolgen in Stapeln

  • Gemeinsame Befehle: set, get, decr, incr, mget usw.

  • Anwendungsszenarien:

  • (1) Speichern Sie den Wert eines bestimmten Felds in MySQL.
  • Entwerfen Sie den Schlüssel als Tabellenname: Primärschlüsselname: Primärschlüsselwert: Feldname.

    (2) Speichern Sie Objekte.
  • Der Zeichenfolgentyp unterstützt jedes Format. Zeichenfolgen werden am häufigsten zum Speichern von JSON- oder anderen objektformatierten Zeichenfolgen verwendet. (In diesem Szenario wird empfohlen, den Hash-Datentyp zu verwenden.)
  • set user:id:1 '[{"id":1,"name":"zj","email":"156577812@qq.com"},{"id":1,"name":"zj","email":"156577812@qq.com"}]'

    (3) Generieren Sie eine automatisch inkrementierende ID.

    Wenn der Wert des Zeichenfolgentyps von Redis die Form einer Ganzzahl hat, kann Redis ihn als eine behandeln Ganzzahl für die automatische Inkrementierung (incr) und automatische Dekrementierung (decr). Da alle Redis-Vorgänge atomar sind, besteht kein Grund zur Sorge über Transaktionsprobleme, die auftreten können, wenn mehrere Clients eine Verbindung herstellen.

Hash

Einführung: Hash speichert die Zuordnung zwischen Strings und String-Werten. Hash speichert verschiedene Attribute des Objekts in der Karte und kann nur bestimmte Attribute des Objekts lesen/aktualisieren. Auf diese Weise können einige zu lange Eigenschaften in Ruhe gelassen werden. Darüber hinaus können verschiedene Module nur die Eigenschaften aktualisieren, die ihnen wichtig sind, ohne dass es aufgrund der Parallelität zu Überschreibkonflikten kommt.

Häufig verwendete Befehle: hget, hset, hgetall usw.

Anwendungsszenarien:
  • Strukturierte Daten wie Benutzerinformationen speichern. In Memcached oder CKV müssen wir Benutzerinformationen wie Spitzname, Alter, Geschlecht, Punkte usw. zuerst serialisieren und als Zeichenfolgenwert speichern. Zu diesem Zeitpunkt müssen wir eines der Elemente ändern Normalerweise müssen wir Folgendes tun: Nachdem der Wert herausgenommen und deserialisiert wurde, wird der Wert eines Elements geändert, dann serialisiert und wieder gespeichert. Dies erhöht nicht nur den Overhead, sondern ist auch nicht für Situationen geeignet, in denen gleichzeitige Vorgänge möglich sind (z. B. erfordern zwei gleichzeitige Vorgänge eine Änderung von Punkten). Mit der Hash-Struktur von Redis können Sie nur einen bestimmten Attributwert ändern, genau wie beim Aktualisieren eines Attributs in der Datenbank. Wie unten gezeigt: Schlüssel ist die Benutzer-ID, Wert ist eine Karte, der Schlüssel dieser Karte ist der Attributname des Mitglieds und Wert ist der Attributwert. Auf diese Weise können die Daten geändert und darauf zugegriffen werden direkt über den Schlüssel seiner internen Karte (Redis Der Schlüssel der internen Karte wird als Feld bezeichnet), dh die entsprechenden Attributdaten können über Schlüssel (Benutzer-ID) + Feld (Attributbezeichnung) manipuliert werden Speichern Sie Daten, und es kommt nicht zu einer Serialisierung und gleichzeitigen Änderungskontrolle. Hier ist jedoch zu beachten, dass Redis eine Schnittstelle (hgetall) zum direkten Abrufen aller Attributdaten bereitstellt. Wenn jedoch viele Mitglieder der internen Karte vorhanden sind, muss die gesamte interne Karte durchlaufen werden Dies ist ein Single-Thread-Modell von Redis. Der Durchlaufvorgang kann zeitaufwändig sein und möglicherweise überhaupt nicht auf Anfragen anderer Clients reagieren. Dies erfordert besondere Aufmerksamkeit.
  • Kann zum Erstellen von Indizes verwendet werden. Beispielsweise müssen Benutzerobjekte manchmal zusätzlich zur ID auch nach Namen abgefragt werden. Sie können beim Einfügen des Benutzerobjekts einen Hash erstellen (set user:101{"id":101). ,“name“: „calvin“}), fügen Sie übrigens einen Eintrag in diesen Hash ein (hset user:name:id calvin 101). Zu diesem Zeitpunkt wird calvin als Schlüssel im Hash mit einem Wert von verwendet 101. Wenn Sie nach Namen abfragen, verwenden Sie hgetuser:name:id calvin, um die ID aus dem Schlüssel namens calvin abzurufen. Wenn Sie mehrere Indizes verwenden müssen, um ein bestimmtes Datenelement zu finden, können Sie einen Hash-Schlüssel verwenden, um die Verwendung mehrerer Zeichenfolgenschlüssel zum Speichern von Indexwerten zu vermeiden.

HINCRBY kann auch zur Implementierung von idmaker verwendet werden. Im Vergleich zum String-Typ-IDmaker benötigt jeder Typ einen Schlüssel, und der Hash-Typ benötigt nur einen Schlüssel.

Der Hash-Datentyp hat den Vorteil, dass er beim Speichern der oben genannten Datentypen flexibler und schneller ist. Insbesondere ist es beim Speichern des String-Typs erforderlich, Strings im JSON-Format zu konvertieren und zu analysieren Wenn keine Konvertierung erforderlich ist, ist Hash in Bezug auf den Speicheraufwand immer noch im Vorteil.

Implementierungsmethode:

Der dem Wert entsprechende Redis-Hash ist eigentlich eine HashMap. Hier gibt es zwei verschiedene Implementierungen. Wenn der Hash weniger Mitglieder hat, verwendet Redis eine eindimensionale Array-ähnliche Methode, um ihn kompakt zu speichern, anstatt ihn zu verwenden Die Codierung des entsprechenden Werts redisObject ist zipmap. Wenn die Anzahl der Mitglieder zunimmt, wird sie automatisch in eine echte HashMap konvertiert.

  • Liste

Einführung:
Liste ist eine nach Einfügungsreihenfolge sortierte Zeichenfolgenliste. Neue Elemente können am Kopf und am Ende eingefügt werden (doppelt verknüpfte Listenimplementierung, der Zeitaufwand für das Hinzufügen von Elementen an beiden Enden). ist O (1)). Wenn beim Einfügen eines Elements der Schlüssel nicht vorhanden ist, erstellt Redis eine neue verknüpfte Liste für den Schlüssel. Wenn alle Elemente in der verknüpften Liste entfernt werden, wird der Schlüssel auch aus Redis entfernt.

Häufig verwendete Befehle: lpush, rpush, lpop, rpop, lrange usw.

Anwendungsszenarien:

Verschiedene Listen, wie Twitters Follow-Liste, Fan-Liste usw., Rankings der neuesten Nachrichten, Kommentare zu jedem Artikel usw. können ebenfalls mithilfe der Listenstruktur von Redis implementiert werden.

Nachrichtenwarteschlange: Sie können die PUSH-Operation von Listen verwenden, um Aufgaben in Listen zu speichern, und dann verwendet der Arbeitsthread die POP-Operation, um die Aufgaben zur Ausführung herauszunehmen. Die Nachrichtenwarteschlange verfügt hier über keinen Bestätigungsmechanismus. Was passiert, wenn der Verbraucher die Aufgabe an Pop übergibt und abstürzt, bevor er sie beendet? Eine Lösung besteht darin, einen zusätzlichen sortierten Satz hinzuzufügen und ihn gleichzeitig an die Liste und den sortierten Satz zu senden. Nachdem der Benutzer die Aufgabe abgeschlossen hat, muss er ZREM verwenden in der sortierten Menge und entfernen Sie regelmäßig die nicht abgeschlossenen Aufgaben aus der sortierten Menge und fügen Sie sie wieder in die Liste ein. Ein anderer Ansatz besteht darin, für jeden Arbeiter eine zusätzliche Liste hinzuzufügen, RPopLPush zu verwenden, wenn Aufgaben angezeigt werden, den Job gleichzeitig in die eigene Liste des Arbeiters aufzunehmen und ihn nach Abschluss mit LREM zu entfernen. Wenn die Clusterverwaltung (z. B. Zookeeper) feststellt, dass der Worker gestorben ist, wird der Inhalt der Worker-Liste an die Hauptliste zurückgegeben.

Mit LRANGE kann die Paging-Funktion von Listeninhalten problemlos realisiert werden.

Vorgang zum Abrufen der neuesten N-Daten: Mit LPUSH wird eine Inhalts-ID eingefügt und als Schlüsselwort am Anfang der Liste gespeichert. LTRIM wird verwendet, um die Anzahl der Elemente in der Liste auf maximal 5000 zu begrenzen. Wenn die Datenmenge, die der Benutzer abrufen muss, diese Cache-Kapazität überschreitet, muss die Anfrage an die Datenbank gesendet werden.

Implementierungsmethode:

Die Redis-Liste ist als bidirektionale verknüpfte Liste implementiert, die die umgekehrte Suche und das Durchlaufen unterstützen kann, was die Bedienung erleichtert. Allerdings bringt sie bei vielen Implementierungen in Redis einen gewissen zusätzlichen Speicheraufwand mit sich, einschließlich des Sendens Pufferwarteschlangen usw. Diese Datenstruktur wird auch verwendet.

  • Set

Einführung: Es handelt sich um ein ungeordnetes Set. Die Elemente im Set haben keine Reihenfolge und werden nicht wiederholt. Durch das Einfügen doppelter Elemente in ein Set werden diese automatisch entfernt.

Häufig verwendete Befehle:

sadd, spop, smembers, sunion usw.

Anwendungsszenarien:

Einige Listen müssen dedupliziert werden, und Set bietet eine wichtige Schnittstelle, um festzustellen, ob sich ein Mitglied in einer Set-Sammlung befindet, was eine Liste nicht bieten kann.

Einige kollektive Daten können in der Weibo-Anwendung gespeichert werden. Beispielsweise können alle Follower eines Benutzers in einer Sammlung gespeichert werden, und alle seine Fans können in einer Sammlung gespeichert werden. Redis bietet auch Operationen wie Schnittmenge, Vereinigung und Differenz für Sammlungen, die sehr praktisch sein können, um Funktionen wie gemeinsame Aufmerksamkeit, gemeinsame Vorlieben und Freunde zweiten Grades zu implementieren. Für alle oben genannten Sammlungsoperationen können Sie auch unterschiedliche Befehle verwenden Auswahlen Geben Sie die Ergebnisse an den Client zurück oder speichern Sie sie in einer neuen Sammlung. Ein weiteres Beispiel: QQ verfügt über eine soziale Funktion namens „Freunde-Tags“. Sie können Ihre Freunde markieren, z. B. „große Schönheit“, „Tycoon“, „Ouba“ usw. Hier können Sie auch die Tags jedes Benutzers in einer Sammlung speichern .

Wenn Sie wissen möchten, wie viele bestimmte registrierte Benutzer oder IP-Adressen eine bestimmte Seite besucht haben, können Sie dies tun: SADD page:day1: Um die Anzahl bestimmter Benutzer zu ermitteln, verwenden Sie SCARD page:day1:. Möchten Sie testen, ob ein bestimmter Benutzer diese Seite besucht hat? SISMEMBER page:day1:.

Implementierungsmethode:

Die interne Implementierung von set ist eine HashMap, deren Wert immer null ist. Tatsächlich wird sie durch die Berechnung des Hash schnell sortiert. Aus diesem Grund kann set feststellen, ob sich ein Mitglied im Set befindet.

  • Sortierter Satz

Einführung: Sortierter Satz. Im Vergleich zum Satz wird die Bewertung des Elements auch bereitgestellt, wenn das Element in den Satz eingefügt wird, und es kann automatisch nach der Bewertung sortiert werden.

Allgemeine Befehle:

zadd, zrange, zrem, zcard usw.

Verwendungsszenarien:

Speichern Sie eine geordnete und nicht duplizierte Sammlungsliste. Beispielsweise kann die öffentliche Timeline von Twitter mit der Veröffentlichungszeit als Ergebnis gespeichert werden , damit Sie die Zeit automatisch nach Zeit sortieren können.

Sie können beispielsweise eine gewichtete Warteschlange erstellen, bei der die Punktzahl für normale Nachrichten 1 und die Punktzahl für wichtige Nachrichten 2 beträgt. Dann kann der Arbeitsthread die Arbeitsaufgaben in der umgekehrten Reihenfolge der Punktzahl abrufen. Priorisieren Sie wichtige Aufgaben.

Verarbeitung abgelaufener Elemente: Verwenden Sie die Unix-Zeit als Schlüssel, um die Liste nach Zeit sortiert zu halten. Rufen Sie current_time und time_to_live ab, um die schwierige Aufgabe, abgelaufene Artikel zu finden, abzuschließen. Eine weitere Hintergrundaufgabe verwendet ZRANGE...WITHSCORES, um abgelaufene Einträge abzufragen und zu löschen.

Implementierungsmethode:

Der sortierte Redis-Satz verwendet intern HashMap und SkipList, um die Speicherung und Reihenfolge von Daten sicherzustellen, während die Skip-Liste alle Mitglieder speichert Die in der HashMap gespeicherte Punktzahl kann eine höhere Sucheffizienz erzielen und ist relativ einfach zu implementieren.

Empfohlenes Lernen: Redis-Video-Tutorial

Das obige ist der detaillierte Inhalt vonFassen Sie Redis-Datentypen und Nutzungsszenarien zusammen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen