Dieser Artikel vermittelt Ihnen relevantes Wissen über Redis. Er stellt hauptsächlich verwandte Themen zu Datenstrukturen vor, einschließlich Zeichenfolgen, Listen, Hashes, geordneten Mengen usw. Ich hoffe, dass er für alle nützlich sein wird.
Empfohlenes Lernen: Redis-Lerntutorial
Redis-Datenstruktur: String (Zeichenfolge), Liste (Liste), Hash (Hash), Set (Satz), Shorted Set (geordneter Satz)
Zugrunde liegende Datenstruktur : einfache dynamische Zeichenfolge, doppelt verknüpfte Liste, komprimierte Liste, Hash-Tabelle, Sprungliste, Ganzzahl-Array
1. Hash-Tabelle: Eine Hash-Tabelle ist eigentlich ein Array, und jedes Element im Array wird als Hash-Bucket bezeichnet.
Hash-Konflikte und Rehash können zu einer Blockierung des Betriebs führen.
Die Methode von Redis zur Lösung von Hash-Konflikten ist das Ketten-Hashing, während Rehash darin besteht, die Anzahl vorhandener Hash-Buckets zu erhöhen. 🔜 Speicherplatz der Hash-Tabelle 1
Der zweite Schritt umfasst eine große Anzahl von Datenkopiervorgängen. Wenn alle Daten in der Hash-Tabelle 1 auf einmal migriert werden, wird der Thread blockiert und andere Anforderungen werden nicht bedient. Um dieses Problem zu vermeiden, verwendet Redis progressives Rehash Das Ende der Liste und die Liste Die Anzahl der Einträge in der Mitte Die komprimierte Liste hat auch ein Element zlend am Ende der Tabelle, um das Ende der Liste darzustellen
Liste überspringen: Eine geordnete verknüpfte Liste kann nur gefunden werden Elemente nacheinander, während eine Sprungliste einen mehrstufigen Index auf der Grundlage der verknüpften Liste hinzufügt. Durch mehrere Sprünge wird eine schnelle Positionierung der Daten erreicht
Die zeitliche Komplexität der folgenden fünf Strukturen
String Typ
String-Typ ist nicht für alle Szenarien geeignet. Er weist einen offensichtlichen Mangel beim Speichern von Daten auf. Da der String-Typ zusätzlichen Speicherplatz benötigt, um Datenlänge, Speicherplatznutzung und andere Informationen aufzuzeichnen, werden diese Informationen auch als Metadaten bezeichnet.
Wenn die gespeicherten Daten Zeichen enthalten, wird die Zeichenfolge mithilfe einer einfachen dynamischen Zeichenfolgen-SDS-Struktur gespeichert.
len ist die verwendete Länge von buf und alloc ist die tatsächlich zugewiesene Länge von buf. Da es viele Redis-Datentypen gibt, unterschiedliche Datentypen Es müssen dieselben Metadaten aufgezeichnet werden, daher verwendet Redis eine RedisObject-Struktur, um diese Metadaten einheitlich aufzuzeichnen.
Wenn die gespeicherte Zeichenfolge weniger als 44 Bytes beträgt, werden SDS und Metadaten einem kontinuierlichen Speicherbereich zugewiesen, der als Embstr-Codierung bezeichnet wird.
Wenn die gespeicherte Zeichenfolge größer als 44 Bytes ist, werden SDS und Metadaten separat gespeichert und als Rohcodierung bezeichnet
Darüber hinaus verwendet Redis eine globale Hash-Tabelle, um alle Schlüssel-Wert-Paare zu speichern. Jedes Element in der Hash-Tabelle ist eine dictEntry-Struktur, die verwendet wird, um auf ein Schlüssel-Wert-Paar zu verweisen value+next verwendet 24 Bytes, belegt aber tatsächlich 32 Bytes. Dies liegt daran, dass jemalloc eine Potenz von 2 findet, die größer als N ist, aber N am nächsten kommt, basierend auf der Anzahl der von uns angewendeten Bytes für N, also Kann die Anzahl häufiger Zuweisungen reduzieren.
Welche Datenstruktur kann verwendet werden, um Speicherplatz zu sparen?
Komprimierte Liste: zlbytes repräsentiert die Länge der Liste, zltail repräsentiert den Endoffset der Liste, zllen repräsentiert die Anzahl der Einträge in der Liste, zlend repräsentiert das Ende der Liste, perv_len repräsentiert die Länge des vorherigen Eintrags, Kodierung stellt die Kodierungsmethode dar, len stellt seine eigene Länge dar, Schlüssel sind die tatsächlich gespeicherten Daten. Redis implementiert Liste, Hash und sortierte Menge basierend auf einer komprimierten Liste
Wie speichere ich einwertige Schlüssel-Wert-Paare mithilfe von Satztypen?
Beim Speichern von Einzelwert-Schlüssel-Wert-Paaren können Sie die sekundäre Codierung von Hash verwenden, bei der der Einzelwertwert in zwei Teile aufgeteilt wird. Der erste Teil wird als Schlüssel des Hash verwendet und der zweite Teil wird verwendet als Wert des Hash
以图片 ID 1101000060 和图片存储对象 ID 3302000080 为例,我们可以把图片 ID 的前 7 位(1101000)作为 Hash 类型的键,把图片 ID 的最后 3 位(060)和图片存储对象 ID 分别作为 Hash 类型值中的 key 和 value。127.0.0.1:6379> info memory# Memoryused_memory:1039120127.0.0.1:6379> hset 1101000 060 3302000080(integer) 1127.0.0.1:6379> info memory# Memoryused_memory:1039136
Hash Der Typ hat zwei zugrunde liegende Implementierungsstrukturen: 1. Komprimierte Liste 2. Hash-Tabelle
Es gibt zwei Schwellenwerte in der Hash-Liste. Sobald diese beiden Schwellenwerte überschritten werden, wird sie aus der komprimierten Liste konvertiert list zu einer Hash-Tabelle
Dargestellt durch hash-max-ziplist-entries Die maximale Anzahl von Elementen in der Hash-Liste, die beim Speichern mit einer komprimierten Liste festgelegt wird
hash-max-ziplist-value gibt die maximale Länge eines einzelnen Elements des Hashs an Wird beim Speichern mit einer komprimierten Liste festgelegt.
Statistikmodus festlegen. 1. Aggregationsstatistik 2.HyperLogLog
3.GEO:
GEO-Datentyp für LBS-Anwendungen
Die zugrunde liegende Struktur von GEO basiert auf Sorted Set, das nach der Gewichtung von Elementen sortiert werden kann und die Gewichtsbewertung unterstützt sortiert Set ist eine Gleitkommazahl (Float-Typ), und der Längen- und Breitengrad sind zwei Zahlen, daher ist GeoHash-Kodierung erforderlich.
Tatsächlich ist der Zweck des Crossovers das in der Abbildung unten gezeigte Konzept. Nach dem Crossover können Sie tatsächlich ein Quadrat in den beiden lokalisieren Wir verwenden die Bereichsabfrage „Sorted Set“, um ähnliche Codierungswerte zu erhalten. Im tatsächlichen geografischen Raum sind beispielsweise 1110011101 benachbarte Codierungen vorhanden tatsächliche Quadrate nicht benachbarter Situationen. Um diese Situation zu vermeiden, können wir 4 oder 8 Quadrate um einen bestimmten Längen- und Breitengrad gleichzeitig abfragen.
Wie bedient man den GEO-Typ?
Bei der Verwendung von GEO-Typen verwenden wir häufig die beiden Befehle GEOADD und GEORADIUS.
GEOADD: Wird zum Aufzeichnen eines Satzes von Längen- und Breitengradinformationen und einer entsprechenden ID in einer GEO-Typensammlung verwendet. Verwendung: Gehen Sie davon aus, dass die Fahrzeug-ID 33 und der Breiten- und Längengrad (116.034579, 39.030452) ist. Wir können eine GEO-Sammlung verwenden, um den Breiten- und Längengrad aller Fahrzeuge zu speichern. Sie müssen lediglich den folgenden Befehl ausführen, um die aktuelle Längen- und Breitenposition des Fahrzeugs mit der ID-Nummer 33 in GEO zu speichern.
GEOADD cars:locations 116.034579 39.030452 33
1. Speichern basierend auf Hash und sortiertem Satz: Warum sollten wir basierend auf zwei Datenstrukturen abfragen?
Der Hash-Typ kann eine schnelle Einzelschlüsselabfrage realisieren, die den Anforderungen der Zeitreihen-Einzelschlüsselabfrage entspricht.
Der Hash-Typ hat jedoch den Nachteil, dass er keine Bereichsabfrage unterstützt. Wir müssen Sorted Set verwenden, da es nach der Gewichtsbewertung der Elemente sortiert wird.
Wie stellen wir also die Atomizität dieser beiden Operationen sicher?
Sie müssen zwei Befehle übergeben: MULTI und EXEC:
MULTI bedeutet Start. Nach Erhalt dieses Befehls stellt Redis den Befehl in die Warteschlange.
EXEC bedeutet Ende. Nach Erhalt dieses Befehls beginnt es mit der Ausführung der Befehle in der Warteschlange Aber wenn Hash und Sorted Set verwendet werden, werden nur Bereichsabfragen, aber keine Aggregatberechnungen unterstützt. Wenn Aggregationsberechnungen auf dem Client durchgeführt werden, kommt es zu einer großen Menge an Netzwerkübertragungen. Daher können aggregierte Berechnungen für Redis über RedisTimeSeries durchgeführt werden.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Redis-Datenstrukturwissens mit Bildern und Texten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!