Maison  >  Article  >  base de données  >  Comment implémenter l'implémentation interne des collections ordonnées dans Redis

Comment implémenter l'implémentation interne des collections ordonnées dans Redis

WBOY
WBOYavant
2023-05-26 19:25:39981parcourir

Implémentation interne des ensembles ordonnés

Il existe deux implémentations internes qui peuvent être utilisées pour les ensembles ordonnés, à savoir la liste compressée (ziplist) et la liste de sauts (skiplist). Ensuite, nous en apprendrons davantage sur chacun en détail.

Utilisation d'une liste compressée comme implémentation interne

Lorsque le nombre d'éléments dans l'ensemble ordonné est inférieur à zset-max-ziplist-entries (la valeur par défaut est 128) et que la longueur de chaque élément membre est moins que zset-max-ziplist-value (la valeur par défaut est 64 octets), utilise la liste compressée comme implémentation interne de l'ensemble ordonné. 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

Chaque élément d'ensemble se compose de deux nœuds de liste compressés rapprochés, où le premier nœud enregistre les membres de l'élément et le deuxième nœud enregistre les branches de l'élément. En organisant les éléments de la liste compressée par ordre de taille de partition, l'utilisation de l'espace mémoire peut être efficacement réduite.

Par exemple, nous utilisons la commande zadd pour créer un ensemble ordonné implémenté avec une liste compressée :

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"

Utiliser une liste de raccourcis comme implémentation interne

Lorsque le nombre d'éléments dans l'ensemble ordonné est supérieur ou égal à zset-max-ziplist-entries (la valeur par défaut est 128), ou la longueur de chaque élément membre est supérieure ou égale à zset-max-ziplist-value (la valeur par défaut est 64 octets) ), utilisez les listes de sauts comme implémentation interne des ensembles ordonnés. <p></p>À l'heure actuelle, l'ensemble commandé contient en fait deux structures, l'une est une table de saut et l'autre est une table de hachage. <p></p>Dans la liste de sauts, tous les éléments sont classés du plus petit au plus grand. Le pointeur <code>object dans le nœud de la table de sauts pointe vers l'objet chaîne du membre de l'élément, et score enregistre le score de l'élément. Grâce aux tables de sauts, Redis peut effectuer rapidement une plage de scores, un classement et d'autres opérations sur des ensembles ordonnés. 🎜🎜Dans une table de hachage, un mappage de l'appartenance à l'élément au score de l'élément est créé pour un ensemble ordonné. Dans une paire clé-valeur, la clé est un objet chaîne et pointe vers le membre de l'élément, tandis que la valeur contient le score de l'élément. Grâce aux tables de hachage, Redis peut trouver rapidement le score d'un élément spécifié. 🎜🎜Bien que les ensembles ordonnés utilisent à la fois des tables de sauts et des tables de hachage, les deux structures de données utilisent des pointeurs pour partager des membres et des scores dans des éléments, sans gaspillage de mémoire supplémentaire. 🎜🎜Par exemple, nous utilisons la commande zadd pour créer un ensemble ordonné implémenté avec une liste à sauter : 🎜
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"
🎜Conversion de l'implémentation interne🎜🎜Lorsqu'un ensemble ordonné est implémenté avec une liste compressée comme implémentation interne Lorsqu'un membre d'élément plus long est ajouté à cet ensemble ordonné, ou lorsqu'il y a trop d'éléments dans cet ensemble ordonné, alors cet ensemble ordonné sera converti en liste de raccourcis en tant qu'implémentation interne. Les ensembles ordonnés utilisant des listes compressées comme implémentations internes ne sont pas convertis en listes ignorées. 🎜🎜Par exemple, nous créons d'abord un ensemble ordonné avec une liste compressée comme implémentation interne : 🎜
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"
🎜 Ensuite, nous y ajoutons un élément avec un membre plus long, qui est converti en une liste de raccourcis comme implémentation interne : 🎜
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"
🎜 Ensuite, supprimez l'élément du membre le plus long de l'ensemble ordonné. L'ensemble ordonné utilise toujours une liste de sauts comme implémentation interne : 🎜rrreee.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer