Was ist die grundlegende Datenstruktur von Redis?
Ganzzahliger Satz
Wenn ein Satz nur wenige ganzzahlige Elemente enthält, verwendet Redis den ganzzahligen Satz intset. Schauen Sie sich zunächst die Datenstruktur von Intset an:
typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset;
Tatsächlich ist die Datenstruktur von Intset relativ einfach zu verstehen. Bei einem Datenspeicherelement speichert die Länge die Anzahl der Elemente, also die Größe des Inhalts, und die Kodierung ist die zum Speichern von Daten verwendete Kodierungsmethode.
Aus dem Code können wir erkennen, dass der Codierungstyp Folgendes umfasst:
#define INTSET_ENC_INT16 (sizeof(int16_t)) #define INTSET_ENC_INT32 (sizeof(int32_t)) #define INTSET_ENC_INT64 (sizeof(int64_t))
Tatsächlich können wir es sehen. Die Art der Redis-Codierung bezieht sich auf die Größe der Daten. Als In-Memory-Datenbank wird dieses Design übernommen, um Speicherplatz zu sparen.
Da es drei Datenstrukturen von klein bis groß gibt, verwenden Sie möglichst kleine Datenstrukturen, um beim Einfügen von Daten Speicherplatz zu sparen. Wenn die eingefügten Daten größer als die ursprüngliche Datenstruktur sind, wird die Erweiterung ausgelöst.
Es gibt drei Schritte zur Erweiterung:
Ändern Sie je nach Typ der neuen Elemente den Datentyp des gesamten Arrays und weisen Sie den Platz neu zu.
Ersetzen Sie die Originaldaten durch den neuen Datentyp und ersetzen Sie sie Es sollte an der Position sein und die Reihenfolge beibehalten
, bevor neue Elemente eingefügt werden
Die Integer-Sammlung unterstützt keine Downgrade-Vorgänge. Nach dem Upgrade kann kein Downgrade durchgeführt werden.
Sprungliste
Die Sprungliste ist eine Art verknüpfte Liste, eine Datenstruktur, die Raum zum Zeitaustausch nutzt. Die Sprungliste unterstützt die durchschnittliche O(logN)-Suche und die O(N)-Komplexitätssuche im ungünstigsten Fall.
Die Sprungliste besteht aus einer zskiplist und mehreren zskiplistNode. Schauen wir uns zunächst ihre Struktur an:
/* ZSETs use a specialized version of Skiplists *//* * 跳跃表节点 */ typedef struct zskiplistNode { // 成员对象 robj *obj; // 分值 double score; // 后退指针 struct zskiplistNode *backward; // 层 struct zskiplistLevel { // 前进指针 struct zskiplistNode *forward; // 跨度 unsigned int span; } level[]; } zskiplistNode; /* * 跳跃表 */ typedef struct zskiplist { // 表头节点和表尾节点 struct zskiplistNode *header, *tail; // 表中节点的数量 unsigned long length; // 表中层数最大的节点的层数 int level; } zskiplist;
Auf der Grundlage dieses Codes können wir also das folgende Strukturdiagramm zeichnen:
Tatsächlich handelt es sich bei der Sprungliste um eine Datenstruktur, die Raum zum Zeitaustausch nutzt und Ebenen als verwendet Der Index der verknüpften Liste.
Jemand hat den Autor von Redis schon einmal gefragt, warum er zum Erstellen von Indizes Sprungtabellen anstelle von Bäumen verwendet? Die Antwort des Autors lautet:
Speicher sparen.
Bei der Verwendung von ZRANGE oder ZREVRANGE handelt es sich um ein typisches Operationsszenario für verknüpfte Listen. Die Leistung der Zeitkomplexität ähnelt der von ausgeglichenen Bäumen.
Der wichtigste Punkt ist, dass die Implementierung der Sprungtabelle sehr einfach ist und das O(logN)-Niveau erreichen kann.
Komprimierte Liste
Komprimierte verknüpfte Liste Der Autor von Redis führt sie als doppelt verknüpfte Liste ein, die so viel Speicherplatz wie möglich sparen soll.
Die in den Kommentaren im Code für eine Komprimierungsliste angegebene Datenstruktur lautet wie folgt:
zlbytes
stellt die Anzahl der von der gesamten Komprimierungsliste verwendeten Speicherbytes darzlbytes
表示的是整个压缩列表使用的内存字节数
zltail
指定了压缩列表的尾节点的偏移量
zllen
是压缩列表 entry 的数量
entry
就是 ziplist 的节点
zlend
标记压缩列表的末端
这个列表中还有单个指针:
ZIPLIST_ENTRY_HEAD
列表开始节点的头偏移量
ZIPLIST_ENTRY_TAIL
列表结束节点的头偏移量
ZIPLIST_ENTRY_END
列表的尾节点结束的偏移量
再看看一个 entry 的结构:
/* * 保存 ziplist 节点信息的结构 */ typedef struct zlentry { // prevrawlen :前置节点的长度 // prevrawlensize :编码 prevrawlen 所需的字节大小 unsigned int prevrawlensize, prevrawlen; // len :当前节点值的长度 // lensize :编码 len 所需的字节大小 unsigned int lensize, len; // 当前节点 header 的大小 // 等于 prevrawlensize + lensize unsigned int headersize; // 当前节点值所使用的编码类型 unsigned char encoding; // 指向当前节点的指针 unsigned char *p; } zlentry;
依次解释一下这几个参数。
prevrawlen
前置节点的长度,这里多了一个 size,其实是记录了 prevrawlen 的尺寸。Redis 为了节约内存并不是直接使用默认的 int 的长度,而是逐渐升级的。
同理 len
记录的是当前节点的长度,lensize
记录的是 len 的长度。headersize
就是前文提到的两个 size 之和。encoding
就是这个节点的数据类型。这里注意一下 encoding 的类型只包括整数和字符串。p
zltail
Gibt den Offset des Endknotens der komprimierten Liste an.
zllen
ist die Anzahl der Einträge in der komprimierten Liste. 🎜🎜entry
ist der Knoten der ziplist 🎜🎜zlend
code> Markiert das Ende der komprimierten Liste 🎜🎜In dieser Liste gibt es auch einen einzelnen Zeiger: 🎜🎜ZIPLIST_ENTRY_HEAD
Der Kopfoffset des Startknotens der Liste 🎜🎜ZIPLIST_ENTRY_TAIL
Der Kopf des Endknotens der Liste Offset 🎜🎜ZIPLIST_ENTRY_END
Der Offset des Endes des Endknotens der Liste🎜🎜Sehen Sie sich die Struktur von an wieder ein Eintrag: 🎜rrreee🎜Erklären Sie diese Parameter der Reihe nach. 🎜🎜prevrawlen
Die Länge des vorhergehenden Knotens. Hier gibt es eine zusätzliche Größe, die tatsächlich die Größe von prevrawlen aufzeichnet. Um Speicher zu sparen, verwendet Redis nicht direkt die standardmäßige int-Länge, sondern aktualisiert sie schrittweise. In ähnlicher Weise zeichnet
len
die Länge des aktuellen Knotens auf und lensize
zeichnet die Länge von len auf. headersize
ist die Summe der beiden oben genannten Größen. encoding
ist der Datentyp dieses Knotens. Beachten Sie hier, dass Codierungstypen nur Ganzzahlen und Zeichenfolgen umfassen. p
Der Zeiger des Knotens, es ist nicht nötig, zu viel zu erklären. 🎜🎜Zu beachten ist, dass jeder Knoten die Länge des vorherigen Knotens speichert. Wenn ein Knoten aktualisiert oder gelöscht wird, müssen auch die Daten nach diesem Knoten geändert werden Der Grenzpunkt, der erweitert werden muss, führt dazu, dass die Knoten nach diesem Knoten den Größenparameter ändern und so eine Kettenreaktion auslösen. Zu diesem Zeitpunkt beträgt die schlechteste Zeitkomplexität beim Komprimieren der verknüpften Liste O (n ^ 2). Allerdings liegen alle Knoten auf kritischen Werten, so dass man sagen kann, dass die Wahrscheinlichkeit relativ gering ist. 🎜Das obige ist der detaillierte Inhalt vonWas ist die grundlegende Datenstruktur von Redis?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Der Redis -Cluster -Modus bietet Redis -Instanzen durch Sharding, die Skalierbarkeit und Verfügbarkeit verbessert. Die Bauschritte sind wie folgt: Erstellen Sie ungerade Redis -Instanzen mit verschiedenen Ports; Erstellen Sie 3 Sentinel -Instanzen, Monitor -Redis -Instanzen und Failover; Konfigurieren von Sentinel -Konfigurationsdateien, Informationen zur Überwachung von Redis -Instanzinformationen und Failover -Einstellungen hinzufügen. Konfigurieren von Redis -Instanzkonfigurationsdateien, aktivieren Sie den Cluster -Modus und geben Sie den Cluster -Informationsdateipfad an. Erstellen Sie die Datei nodes.conf, die Informationen zu jeder Redis -Instanz enthält. Starten Sie den Cluster, führen Sie den Befehl erstellen aus, um einen Cluster zu erstellen und die Anzahl der Replikate anzugeben. Melden Sie sich im Cluster an, um den Befehl cluster info auszuführen, um den Clusterstatus zu überprüfen. machen

Redis verwendet Hash -Tabellen, um Daten zu speichern und unterstützt Datenstrukturen wie Zeichenfolgen, Listen, Hash -Tabellen, Sammlungen und geordnete Sammlungen. Ernähren sich weiterhin über Daten über Snapshots (RDB) und appendiert Mechanismen nur Schreibmechanismen. Redis verwendet die Master-Slave-Replikation, um die Datenverfügbarkeit zu verbessern. Redis verwendet eine Ereignisschleife mit einer Thread, um Verbindungen und Befehle zu verarbeiten, um die Datenatomizität und Konsistenz zu gewährleisten. Redis legt die Ablaufzeit für den Schlüssel fest und verwendet den faulen Löschmechanismus, um den Ablaufschlüssel zu löschen.

Um alle Schlüssel in Redis anzuzeigen, gibt es drei Möglichkeiten: Verwenden Sie den Befehl keys, um alle Schlüssel zurückzugeben, die dem angegebenen Muster übereinstimmen. Verwenden Sie den Befehl scan, um über die Schlüssel zu iterieren und eine Reihe von Schlüssel zurückzugeben. Verwenden Sie den Befehl Info, um die Gesamtzahl der Schlüssel zu erhalten.

Um die Redis -Versionsnummer anzuzeigen, können Sie die folgenden drei Methoden verwenden: (1) Geben Sie den Info -Befehl ein, (2) Starten Sie den Server mit der Option --version und (3) die Konfigurationsdatei anzeigen.

Schritte zur Lösung des Problems, das Redis-Server nicht finden kann: Überprüfen Sie die Installation, um sicherzustellen, dass Redis korrekt installiert ist. Setzen Sie die Umgebungsvariablen Redis_host und Redis_port; Starten Sie den Redis-Server Redis-Server; Überprüfen Sie, ob der Server Redis-Cli Ping ausführt.

Redis bestellte Sets (ZSETs) werden verwendet, um bestellte Elemente und Sortieren nach zugehörigen Bewertungen zu speichern. Die Schritte zur Verwendung von ZSET umfassen: 1. Erstellen Sie ein Zset; 2. Fügen Sie ein Mitglied hinzu; 3.. Holen Sie sich eine Mitgliederbewertung; 4. Holen Sie sich eine Rangliste; 5. Holen Sie sich ein Mitglied in der Rangliste; 6. Ein Mitglied löschen; 7. Holen Sie sich die Anzahl der Elemente; 8. Holen Sie sich die Anzahl der Mitglieder im Score -Bereich.

Der beste Weg, um Redis -Quellcode zu verstehen, besteht darin, Schritt für Schritt zu gehen: Machen Sie sich mit den Grundlagen von Redis vertraut. Wählen Sie ein bestimmtes Modul oder eine bestimmte Funktion als Ausgangspunkt. Beginnen Sie mit dem Einstiegspunkt des Moduls oder der Funktion und sehen Sie sich die Codezeile nach Zeile an. Zeigen Sie den Code über die Funktionsaufrufkette an. Kennen Sie die von Redis verwendeten Datenstrukturen. Identifizieren Sie den von Redis verwendeten Algorithmus.

Die Verwendung der REDIS -Anweisung erfordert die folgenden Schritte: Öffnen Sie den Redis -Client. Geben Sie den Befehl ein (Verbschlüsselwert). Bietet die erforderlichen Parameter (variiert von der Anweisung bis zur Anweisung). Drücken Sie die Eingabetaste, um den Befehl auszuführen. Redis gibt eine Antwort zurück, die das Ergebnis der Operation anzeigt (normalerweise in Ordnung oder -err).
