1 跳跃表
跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点。
跳跃表实现了有序集合键(zset)。
1.1 跳跃表的实现
redis 跳跃表是由zskiplistNode,zskipList。
zskiplistNode用于表示跳跃表节点,而zskiplist则用于保存跳跃表节点相关信息。
-
header:指向跳跃表的表头节点
-
tail:指向跳跃表表尾节点
-
level: 记录跳跃表,层数最大的节点层数
-
length: 记录跳跃表的长度,也就是跳跃表包含节点的数量
-
层:节点中每个层都带有两个属性:前进指针和跨度。前进指针用于访问位于表尾方向的其他节点,而跨度则记录了前进指针所指向节点和当前节点的距离。
-
后退指针:节点中用bw字样标记后退指针,用于在程序从表尾向表头遍历时使用。
-
分值:节点中所保存的分值,在跳跃表中,节点按各自所保存的分值从小到大排列
-
成员对象:各个节点中的o1等是节点所保存的成员对象
1.2 跳跃表节点
typedef struct zskiplistNode{
// 后退指针
struct zskiplistNode *backward;
//分值
double score;
//成员对象
robj *obj
// 层
struct zskipliatLevelP{
// 前进指针
struct zskiplistNode *forward;
// 跨度
unsigned int span;
}level[];
}zskiplistNode;
-
层 : 跳跃表节点的level数组包含多个元素,每个元素指向其他节点,程序通过这些层加快访问其他节点的速度。
-
前进指针:用于从表头访问表尾
-
跨度:用于记录两个节点之间的距离
-
后退指针:用于从表尾向表头方向访问节点,每次只能后退至前一个节点。
-
分值和成员
节点的分值(score)是double 类型数据。跳跃表中的所有节点都按分值大小来排序。
节点的成员对象是一个指针,指向保存sds值的字符串对象。
1.3 重点
- 跳跃表是有序集合的底层实现之一
- redis的跳跃表是由 zskipList 和zskipListNode结构组成的
- 跳跃表节点的层高为1到 32 之间的随机数
- 每个节点可以包含相同的分值,但是成员对象必须是唯一的
- 节点按照分值大小排序,当分值相同时,安照对象大小进行排序