跳跃表

tech2022-12-03  109

Redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构

struct zskiplist{ //指向跳跃表的头、尾节点 struct zskiplistNode *header,*tail; //跳跃表的长度 unsigned long length; //层数最大的节点的层数 int level; }zskiplist; struct zskiplistNode{ //层(level) struct zskiplistLevel{ //前进指针 struct zskiplistNode *forward; //跨度 unsigned int span; }level[]; //后退指针,表尾遍历的时候使用 struct zskiplistNode *backward; double score; robj *obj; }zskiplistNode;

跳跃表节点的level数组可以包含多个元素,每个元素都包含指向其他节点的一个指针,程序可以通过这些层来加快访问其他节点的速度。

前进指针

每个层都有一个指向表尾方向的前进指针(level[i].forward属性),用于从表头向表尾方向访问节点

跨度

用于记录两个节点之间的距离,用来计算排位(rank)。

后退指针

用于从表尾向表头方向访问节点,每次只能后退至前一个节点。

分值和成员

分值相同的节点将按照成员对象在字典序中的大小来进行排序,成员对象较小的节点会排在前面。

最新回复(0)