redis跳表

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。

跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。

Redis使用跳跃表作为有序集合键的底层实现之一,如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。


位于图片最左边的是zskiplist结构,该结构包含以下属性:

header:指向跳跃表的表头节点。

tail:指向跳跃表的表尾节点。

level:记录目前跳跃表内,层数最大的那个节点的层数(表头节点的层数不计算在内)。

length:记录跳跃表的长度,也即是,跳跃表目前包含节点的数量(表头节点不计算在内)。

位于zskiplist结构右方的是四个zskiplistNode结构,该结构包含以下属性:

层(level):节点中用LlL2、L3等字样标记节点的各个层,L1代表第一层,L2 代表第二层,以此类推。每个层都带有两个属性:前进指针和跨度。前进指针用于访问位于表尾方向的其他节点,而跨度则记录了前进指针所指向节点和当前节点的距离。在上面的图片中,连线上带有数字的箭头就代表前进指针,而那个数字就是跨度。当程序从表头向表尾进行遍历时,访问会沿着层的前进指针进行。

一般来说,层的数量越多,访问其他节点的速度就越快。每次创建一个新跳跃表节点的时候,程序都根据幂次定律(power law,越大的数出现的概率越小)随机生成一个介于1和32之间的值作为level数组的大小,这个大小就是层的“高度”。

后退(backward)指针:节点中用BW字样标记节点的后退指针,它指向位于当前节点的前一个节点。后退指针在程序从表尾向表头遍历时使用。

分值(score):各个节点中的1.0、2• 0和3.0是节点所保存的分值。在跳跃表中, 节点按各自所保存的分值从小到大排列。

成员对象(obj ):各个节点中的olo2和o3是节点所保存的成员对象。



参考:《redis设计与实现》

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 跳表实现 跳跃表(skiplist)是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到...
    来年花惜阅读 4,316评论 1 4
  • 转载:http://kenby.iteye.com/blog/1187303 在Redis中应用 跳跃表是一种有序...
    myf008阅读 266评论 0 0
  • 跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快捷访问节点的...
    wenmingxing阅读 1,815评论 0 3
  • Redis为什么用跳表而不用平衡树? Redis里面使用skiplist是为了实现sorted set这种对外的数...
    觉海性澄圆阅读 884评论 0 0
  • 在Redis中只有两处使用到了跳跃表,一个是实现有序集合键,另一个就是在集群节点中用作内部数据结构,用来保存槽和键...
    HRADPX阅读 793评论 0 1