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.
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
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"
zset-max-ziplist-entries
(Standard ist 128), oder die Länge jedes Elementmitglieds ist größer oder gleich zset-max-ziplist-value< /code> (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"
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"
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"
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!