redis设计与实现总结--跳跃表
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。
查找效率平均O(logn),最坏O(N),redis有序集合键的底层实现之一。
![](https://img2020.cnblogs.com/blog/1665332/202105/1665332-20210508152613134-1147883461.png)
zskiplist包含四个重要成员变量
header:指向跳跃表的表头节点。
tail:指向跳跃表的表尾节点。
level:记录目前跳跃表内,层数最大的哪个节点的层数(表头节点不算其中)。
length:记录跳跃表的长度,也就是包含节点的数量(表头不算)。
其中跳跃表的节点结构
typedef struct zskiplistNode{ //后退指针 struct zskiplistNode *backward; //分值,按分值从小到大排序 double score; //成员对象 robj *obj; //层 struct zskiplistLevvel{ //前进指针 zskiplistNode *forward; //跨度 unsigned int span; } level[]; }zskiplistNode;
其中层每次根据幂次定律随机生成1—32之间的值作为level数组的大小。
跨度:用于记录两个节点的距离,指向null的所有前进指针的跨度为0,其他为1。主要用于计算排位(跨度累加)。
后退指针:用于从尾开始遍历节点。
obj:指向一个字符串对象,保存SDS。
分值相同的节点按照成员对象在字典序中的大小排序。