Heim  >  Artikel  >  Datenbank  >  Redis-Datentypen und Anwendungsszenarien

Redis-Datentypen und Anwendungsszenarien

angryTom
angryTomOriginal
2020-02-13 13:23:368270Durchsuche

Redis-Datentypen und Anwendungsszenarien

Redis-Datentypen und Anwendungsszenarien

Redis unterstützt 5 Datentypen: String (String), Hash (Hash), Liste (Liste) , set (Satz) und zset (sortierter Satz: geordneter Satz).

1. Zeichenfolge

Einführung: Der Datentyp „Strings“ ist der am häufigsten verwendete und einfachste Schlüsselwerttyp, und die gewöhnliche Schlüssel-/Wertspeicherung kann in diese Kategorie eingeordnet werden . Der Wert kann nicht nur eine Zeichenfolge, sondern auch eine Zahl sein. Da es binärsicher ist, können Sie den Inhalt einer Bilddatei als Zeichenfolge speichern. Der String von Redis kann die aktuellen Funktionen von Memcached vollständig realisieren und ist effizienter. Zusätzlich zu den gleichen Get-, Set-, Incr- und Decr-Operationen wie Memcached bietet Redis auch die folgenden zusätzlichen Operationen:

1. Ermitteln Sie die Länge der Zeichenfolge

2 zum String-Inhalt

3. Einen bestimmten Inhalt des Strings festlegen und erhalten

4. Einen bestimmten Teil des Strings festlegen und abrufen

5 Stapel Inhalt der Zeichenfolge

Allgemeine Befehle: set, get, decr, incr, mget usw.

Anwendungsszenarien:

1. Alle Szenarien, in denen Memcached und CKV angewendet werden. Auf Zeichenfolgen und Zahlen wird direkt zugegriffen. Strukturierte Daten müssen zuerst serialisiert und dann entsprechend auf einen Wert gesetzt werden. Nach Erhalt des Werts ist eine Deserialisierung erforderlich.

2. Sie können die Anweisungen INCR, INCRBY, DECR, DECRBY und andere von Redis verwenden, um den Effekt der Atomzählung zu erzielen. Das heißt, es kann verwendet werden, um statistische Zählanforderungen für Unternehmen zu erfüllen. Es kann auch zur Implementierung von idmaker verwendet werden, der weltweit eindeutige IDs generiert.

3. Speichern Sie den Sitzungsschlüssel, um ein verteiltes Sitzungssystem zu implementieren. Mit dem Redis-Schlüssel kann die Ablaufzeit einfach festgelegt werden, um den automatischen Ablauf des Sitzungsschlüssels zu realisieren. Wenn Sie den Skey überprüfen, leiten Sie ihn zunächst anhand der UID an die entsprechenden Redis weiter. Wenn der Skey nicht abgerufen werden kann, bedeutet dies, dass der Skey abgelaufen ist und Sie sich erneut anmelden müssen, wenn der Skey abgerufen wird und die Überprüfung erfolgreich ist Zeit des Schlüssels kann aktualisiert werden.

4. Setze nx oder SetNx, setze nur, wenn der Schlüssel nicht existiert. Es kann verwendet werden, um den Master zu wählen oder verteilte Sperren zu implementieren: Alle Clients versuchen ständig, SetNx Master myName zu verwenden, um sich für den Master zu registrieren, und der erfolgreiche Client verwendet ständig Expire, um seine Ablaufzeit zu aktualisieren. Wenn der Master stirbt, wird der Schlüssel ungültig und die verbleibenden Knoten werden erneut entwendet.

5. Mit dem von redis2.6 unterstützten Lua-Skript können zwei sicherere verteilte Sperren implementiert werden: Eine eignet sich für Szenarien, in denen Prozesse konkurrieren, aber immer ein einzelner Prozess die Sperre erhält und verarbeitet. Sofern der ursprüngliche Verarbeitungsprozess nicht aufhängt und die Sperre abläuft, wird die Sperre von anderen Prozessen übernommen. Es ist nicht erforderlich, es aktiv zu entsperren. Implementiert durch Lua-Skripte von get, expire/pexpire, setnx ex|; ein Szenario, das für jeden Prozess geeignet ist, um Sperren zu erwerben und zu verarbeiten. Erhalten Sie die Sperre über set nx ex|. px. Nach der Verwendung müssen Sie die Sperre zuerst mit get beurteilen und dann mit del aufheben.

6. GetSet setzt den neuen Wert und gibt den alten Wert zurück. Um beispielsweise einen Zähler zu implementieren, können Sie GetSet verwenden, um den Zähler abzurufen und ihn auf 0 zurückzusetzen.

7. GetBit/SetBit/BitOp/BitCount, wie man BitMap zum Beispiel spielt, wenn man die Anzahl der einzelnen Besucher heute zählt, hat jeder registrierte Benutzer einen Offset. Wenn er heute reinkommt, setzt er sein Bit zu 1. Verwenden Sie BitCount, um die Gesamtzahl der Personen heute zu ermitteln.

8. Anhängen/SetRange/GetRange/StrLen, Erweitern, Ersetzen, Abfangen und Ermitteln der Textlänge, was für bestimmte Datenformate sehr nützlich ist.

Implementierungsmethode: Die Zeichenfolge wird standardmäßig in Redis gespeichert und von redisObject referenziert. Wenn sie auf incr, decr und andere Operationen stößt, wird sie zur Berechnung in einen numerischen Typ konvertiert. Das Codierungsfeld von redisObject ist int.

2. 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.

Allgemeine Befehle: hget, hset, hgetall usw.

Anwendungsszenarien:

1. 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:

2. Der Schlüssel ist die Benutzer-ID, der Wert ist eine Karte, der Schlüssel dieser Karte ist der Attributname des Mitglieds und der Wert ist der Attributwert, sodass die Änderung und der Zugriff möglich sind Die Datenverarbeitung kann direkt über den internen Schlüssel der Karte erfolgen (der Schlüssel der internen Karte wird in Redis als Feld bezeichnet), d. h. die entsprechenden Attributdaten können über Schlüssel (Benutzer-ID) + Feld (Attributbezeichnung) manipuliert werden ). Es besteht keine Notwendigkeit, Daten wiederholt zu speichern, und es kommt auch nicht zu Problemen bei der Sequenzierung und gleichzeitigen Änderungskontrolle.

3. Hier ist jedoch zu beachten, dass Redis eine Schnittstelle (hgetall) bereitstellt, um alle Attributdaten direkt abzurufen. Wenn jedoch viele Mitglieder der internen Karte vorhanden sind, muss die gesamte interne Karte durchlaufen werden. Aufgrund des Single-Thread-Modells von Redis kann dieser Durchlaufvorgang zeitaufwändig sein und möglicherweise überhaupt nicht auf Anfragen anderer Clients reagieren. Dies erfordert besondere Aufmerksamkeit.

4. 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 verwendet, mit einem Wert von 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.

5. 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.

Implementierungsmethode:

Der dem Wert entsprechende Redis-Hash ist eigentlich eine HashMap. Es gibt zwei verschiedene Implementierungen. Wenn der Hash weniger Mitglieder hat, verwendet Redis ein ähnliches eindimensionales Array Speicher sparen. Methode zum kompakten Speichern ohne Verwendung der echten HashMap-Struktur. Wenn die Anzahl der Mitglieder zunimmt, wird sie automatisch in eine echte HashMap umgewandelt.

3. Liste

Einführung: Liste ist eine doppelt verknüpfte Liste, die bidirektionales Pop/Push unterstützt. und Pop vom rechten Ende – LPush/RPop , und es gibt auch eine blockierende Version BLPop/BRPop, bei der der Client blockieren kann, bis eine Nachricht eintrifft. Es gibt auch RPopLPush/BRPopLPush, das auftaucht und zum Client zurückkehrt. Gleichzeitig schiebt es sich in eine andere Liste und LLen erhält die Länge der Liste. Es gibt auch Operationen nach Wert: LRem (Elemente nach Wert löschen), LInsert (vor und nach Elementen mit einem bestimmten Wert einfügen), die Komplexität ist O(N), N ist die Länge der Liste, da der Wert der Liste ist nicht eindeutig. Um alle Elemente zu durchlaufen, benötigt Set nur O(log(N)).

Durch den Index ausgeführte Operationen: Der Index beginnt bei 0, die Warteschlange wird von links nach rechts gezählt, und wenn der Index eine negative Zahl ist, erfolgt die Zählung von rechts nach links. LSet legt den Elementwert per Index fest. LIndex gibt das Element nach Index zurück. Im Gegensatz zu POP, das Elemente direkt wegspringt, gibt LRange nur Elemente mit einem Index in der Liste zurück. Es ist ein Favorit für Paging. LTrim begrenzt die Größe der Liste und behält beispielsweise nur die letzten 20 Nachrichten bei. Die Komplexität beträgt ebenfalls O(N), wobei N von LSet die Länge der Liste ist, N von LIndex der Wert des Index ist und N von LRange der Wert von start + die Anzahl der aufgelisteten Elemente ist Bei einer verknüpften Liste und nicht bei einem Array handelt es sich bei dem Index um einen Index. Access erfordert tatsächlich das Durchlaufen der verknüpften Liste, es sei denn, der Index ist zufällig der Anfang und das Ende der Warteschlange. N von LTrim ist die Anzahl der zu entfernenden Elemente.

Allgemeine Befehle: lpush, rpush, lpop, rpop, lrange usw.

Anwendungsszenarien:

1. Verschiedene Listen, wie Twitter-Follow-Liste, Fan-Liste usw., aktuelle Nachrichtenrankings, Kommentare zu jedem Artikel usw. können ebenfalls mit Redis implementiert werden. Listenstruktur.

2 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, beim Verteilen einen zusätzlichen sortierten Satz hinzuzufügen und ihn gleichzeitig an die Liste 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 beim Auftauchen von Aufgaben zu verwenden, 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.

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

4. Der 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 Implementierung der Redis-Liste ist eine bidirektionale verknüpfte Liste, die die umgekehrte Suche und Durchquerung unterstützen kann, was bequemer zu bedienen ist, aber etwas zusätzlichen Speicheraufwand mit sich bringt . Redis-intern Viele Implementierungen, einschließlich Sendepufferwarteschlangen usw., verwenden diese Datenstruktur ebenfalls.

4. Menge

Einführung: Es handelt sich um eine ungeordnete Menge. Die Elemente in der Menge haben keine Reihenfolge und werden nicht wiederholt. Durch das Einfügen doppelter Elemente in Set werden diese automatisch entfernt.

Allgemeine Befehle:

sadd, spop, smembers, sunion usw.

Anwendungsszenarien:

1. Einige Listen, die dedupliziert werden müssen, bieten eine wichtige Schnittstelle, um festzustellen, ob sich ein Mitglied in einer Set-Sammlung befindet . .

2. In der Weibo-Anwendung können beispielsweise alle Follower eines Benutzers und alle Fans 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 .

3. 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 Hashs schnell sortiert. Dies ist auch das, was set bereitstellen kann, um festzustellen, ob Ein Mitglied ist Reason innerhalb der Menge.

5. Sortierter Satz

Einführung: Sortierter Satz, im Vergleich zum Satz wird auch die Bewertung des Elements bereitgestellt, wenn das Element in den Satz eingefügt wird können automatisch nach der Punktzahl sortiert werden.

Allgemeine Befehle:

zadd, zrange, zrem, zcard usw.

Verwendungsszenarien:

1. Speichern Sie einen geordneten und nicht duplizierten Satz Listen, wie zum Beispiel die öffentliche Timeline von Twitter, können mit dem Veröffentlichungszeitpunkt als Score gespeichert werden, sodass sie beim Abruf automatisch nach Zeit sortiert werden.

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

3. Ranking bezogen: ZADD-Bestenliste Es ist einfach, die 100 Benutzer mit der höchsten Punktzahl zu erreichen: ZREVRANGE-Rangliste 0 99. Das globale Ranking des Benutzers ist ebenfalls ähnlich. Führen Sie einfach Folgendes aus: ZRANK-Bestenliste .

4. Nachrichten werden nach Benutzerstimmen und Zeitwert sortiert, während ZADD = Punkte / Zeit^Alpha. Auf diese Weise werden die Nachrichten entsprechend ausgegraben, aber die Zeit wird die Nachrichten begraben bestimmter Index.

5. Verarbeitung abgelaufener Elemente: Verwenden Sie Unix-Zeit als Schlüsselwort, 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 eine SkipList, um die Speicherung und Reihenfolge der Daten sicherzustellen, und alle Mitglieder werden übersprungen In der Tabelle gespeichert, und die Sortierbasis ist die in der HashMap gespeicherte Bewertung. Durch die Verwendung der Sprungtabellenstruktur kann eine höhere Sucheffizienz erzielt werden, und die Implementierung ist relativ einfach.

Weitere Informationen zu Redis finden Sie in der Spalte Redis-Datenbank-Tutorial.

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn