Heim  >  Artikel  >  Datenbank  >  So implementieren Sie die interne Implementierung geordneter Sammlungen in Redis

So implementieren Sie die interne Implementierung geordneter Sammlungen in Redis

WBOY
WBOYnach vorne
2023-05-26 19:25:39982Durchsuche

Interne Implementierung geordneter Mengen

Es gibt zwei interne Implementierungen, die für geordnete Mengen verwendet werden können, nämlich komprimierte Liste (Ziplist) und Sprungliste (Skiplist). Als nächstes werden wir mehr über jedes einzelne im Detail erfahren.

Komprimierte Liste als interne Implementierung verwenden

Wenn die Anzahl der Elemente in der geordneten Menge kleiner als zset-max-ziplist-entries ist (Standard ist 128) und die Länge jedes Elementmitglieds beträgt kleiner als zset-max-ziplist-value (Standard ist 64 Bytes), verwendet die komprimierte Liste als interne Implementierung des geordneten Satzes. zset-max-ziplist-entries(默认为128个),并且每个元素成员的长度小于zset-max-ziplist-value(默认为64字节)的时候,使用压缩列表作为有序集合的内部实现。

每个集合元素由两个紧挨在一起的两个压缩列表结点组成,其中第一个结点保存元素的成员,第二个结点保存元素的分支。通过按照分数的大小顺序将压缩列表中的元素依次排列在一起,可以有效地减少内存空间的使用。

举个例子,我们使用zadd命令创建一个以压缩列表为实现的有序集合:

127.0.0.1:6379> zadd one-more-zset 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zrange one-more-zset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> object encoding one-more-zset
"ziplist"

以跳跃表作为内部实现

当有序集合的元素个数大于等于zset-max-ziplist-entries(默认为128个),或者每个元素成员的长度大于等于zset-max-ziplist-value(默认为64字节)的时候,使用跳跃表作为有序集合的内部实现。

此时,在有序集合中其实包含了两个结构,一个是跳跃表,另一个是哈希表。

在跳跃表中,所有元素按照从小到大的顺序排列。跳跃表的结点中的object指针指向元素成员的字符串对象,score保存了元素的分数。通过跳跃表,Redis可以快速地对有序集合进行分数范围、排名等操作。

在哈希表中,为有序集合创建了一个从元素成员到元素分数的映射。在键值对中,键是字符串对象并指向元素成员,而值则保存了元素的分数。通过哈希表,Redis可以快速查找指定元素的分数。

虽然有序集合同时使用跳跃表和哈希表,但是这两种数据结构都使用指针共享元素中的成员和分数,不会额外的内存浪费。

举个例子,我们使用zadd

Jedes Set-Element besteht aus zwei nahe beieinander liegenden komprimierten Listenknoten, wobei der erste Knoten die Mitglieder des Elements und der zweite Knoten die Zweige des Elements speichert. Durch die Anordnung der Elemente in der komprimierten Liste in der Reihenfolge ihrer Score-Größe kann der Speicherplatzverbrauch effektiv reduziert werden.

Zum Beispiel verwenden wir den Befehl zadd, um eine geordnete Menge zu erstellen, die mit einer komprimierten Liste implementiert wird:

127.0.0.1:6379> zadd one-more-zset 1 long-long-long-long-long-long-long-long-long-long-long-long-long-long
(integer) 1
127.0.0.1:6379> zrange one-more-zset 0 -1
1) "long-long-long-long-long-long-long-long-long-long-long-long-long-long"
127.0.0.1:6379> object encoding one-more-zset
"skiplist"

Verwenden einer Sprungliste als interne Implementierung

Wenn die Anzahl der Elemente in der geordneten Menge ist größer oder gleich zset-max-ziplist-entries (Standard ist 128), oder die Länge jedes Elementmitglieds ist größer oder gleich zset-max-ziplist-value (Standard ist 64 Bytes)), verwenden Sie Sprunglisten als interne Implementierung geordneter Mengen. <p></p>Zu diesem Zeitpunkt enthält der bestellte Satz tatsächlich zwei Strukturen, eine ist eine Sprungtabelle und die andere eine Hash-Tabelle. <p></p>In der Sprungliste sind alle Elemente in der Reihenfolge von klein nach groß angeordnet. Der <code>object-Zeiger im Knoten der Sprungtabelle zeigt auf das String-Objekt des Elementmitglieds, und score speichert die Punktzahl des Elements. Durch Sprungtabellen kann Redis schnell Punktebereichs-, Rangfolge- und andere Operationen an geordneten Mengen durchführen. 🎜🎜In einer Hash-Tabelle wird für eine geordnete Menge eine Zuordnung von der Elementmitgliedschaft zur Elementbewertung erstellt. In einem Schlüssel-Wert-Paar ist der Schlüssel ein Zeichenfolgenobjekt und zeigt auf das Elementmitglied, während der Wert die Punktzahl des Elements enthält. Mithilfe von Hash-Tabellen kann Redis schnell die Punktzahl eines bestimmten Elements ermitteln. 🎜🎜Obwohl geordnete Mengen sowohl Skip-Tabellen als auch Hash-Tabellen verwenden, verwenden beide Datenstrukturen Zeiger, um Mitglieder und Bewertungen in Elementen zu teilen, ohne zusätzliche Speicherverschwendung. 🎜🎜Zum Beispiel verwenden wir den Befehl zadd, um eine geordnete Menge zu erstellen, die mit einer Sprungliste implementiert wird: 🎜
127.0.0.1:6379> zadd one-more-zset 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zrange one-more-zset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> object encoding one-more-zset
"ziplist"
🎜Konvertierung der internen Implementierung🎜🎜Wenn eine geordnete Menge mit einer komprimierten Liste als implementiert wird interne Implementierung Wenn dieser sortierten Menge ein längeres Elementmitglied hinzugefügt wird oder wenn diese sortierte Menge zu viele Elemente enthält, wird die sortierte Menge als interne Implementierung in eine Sprungliste konvertiert. Geordnete Mengen, die komprimierte Listen als interne Implementierungen verwenden, werden nicht in Skip-Listen konvertiert. 🎜🎜Zum Beispiel erstellen wir zunächst eine geordnete Menge mit einer komprimierten Liste als interne Implementierung: 🎜
127.0.0.1:6379> zadd one-more-zset 4 long-long-long-long-long-long-long-long-long-long-long-long-long-long
(integer) 1
127.0.0.1:6379> zrange one-more-zset 0 -1
1) "one"
2) "two"
3) "three"
4) "long-long-long-long-long-long-long-long-long-long-long-long-long-long"
127.0.0.1:6379> object encoding one-more-zset
"skiplist"
🎜 Dann fügen wir ein Element mit einem längeren Mitglied hinzu und es wird in eine Sprungliste als interne Implementierung umgewandelt: 🎜
127.0.0.1:6379> zrem one-more-zset long-long-long-long-long-long-long-long-long-long-long-long-long-long
(integer) 1
127.0.0.1:6379> zrange one-more-zset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> object encoding one-more-zset
"skiplist"
🎜Entfernen Sie dann das Element des längeren Mitglieds aus der geordneten Menge. Die geordnete Menge verwendet weiterhin eine Sprungliste als interne Implementierung: 🎜rrreee

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die interne Implementierung geordneter Sammlungen in Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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