4、跃进表

跃进表是一个有序数据结构,它通过在每个节点上维护多个指向其他节点的指针,从而达到快速访问节点的目的;
跃进表支持平均O(logN)、最坏O(N)复杂度的节点查询,还可以通过顺序性来批量处理节点;
大多数情况下,跳跃表与平衡树效率差不多,并且因为跳跃表的实现比平衡树要来的更简单,所以可以使用跳跃表来替换平衡树。
Redis使用跳跃表作为有序集合键的底层实现之一。如果一个有序集合包含的元素数量比较多,或者有序集合中元素的成员是比较长的字符串时,Redis就是使用跳跃表来作为有序集合键的底层实现。
Redis中只有两个地方可以使用到跳跃表一个是有序集合,另一个是集群节点中用作内部数据结构。
Redis的跳跃表由redis.h/zskiplistNode和redis.h/zskiplist两个结构定义,其中zskiplistNode结构用于表示跳跃表节点,而zskiplist结构则用于保存跳跃表节点的相关信息,比如节点数量、以及指向表头节点和表尾节点的指针等等。
上面是zskiplistNode跳跃表节点结构;
header:指向跳跃表的表头节点;
tail:指向跳跃表的表尾节点;
level:记录目前跳跃表内,层次最大的那个节点的层数(表头节点的层数不计算在内);
length:记录跳跃表的长度,即是跳跃表目前包含节点的数量(表头节点不计算在内);
层(level):如上图中,L1、L2都是层级。每个层都带有两个属性:前进指针和跨度;
前进指针用于访问表尾方向的其他节点,
而跨度则记录了前进指针所指向的节点和当前节点的距离;
后退(backward):节点中BW代表后退指针,它指向位于当前节点前一个的节点,后退指针在程序从表尾向表头遍历时使用。
分数:各个节点中所保存的值。在跳跃表中各个节点按照各自所保存的分值从小到大排序;
成员对象:各个节点中,o1、o2、o3是节点所保存的成员对象。
 
跳跃表节点的实现由redis.h/zskiplistNode结构定义:
typedef struct zskiplistNode{
//后退指针
struct zskiplistNode *backward;
//分值
double score;
//成员对象
robj *obj;
//层
struct zskiplistNode {
//前进指针
struct zskiplistNode *forward;
//跨度
unsigned int span;
} level[];
}
posted @ 2019-04-10 00:08  使用D  阅读(141)  评论(0编辑  收藏  举报