Redis 跳跃表
- 概述
- 跳跃表skiplist,是一种有序的数据结构,通过在每个节点中维持多个指向其他节点的指针,达到快速访问的目的。
- 时间复杂度
- 平均O(logn)
- 最坏O(n)
- 因为大部分情况下效率与平衡树媲美,并且实现方式更为简单,故不少程序使用此数据结构代替平衡树。
- redis中使用跳表作为有序集合的底层实现。另外一个被用到的地方就是在集群节点中当作内部数据结构
- 实现
- zskiplistNode表示跳跃表节点
- level 层
- 数组
- 前进指针
- 遍历 null结束
- 跨度 表示前进指针指向的节点与当前节点的距离
- 指向null的前进指针跨度都为0
- backward指针
- BW
- 遍历跳表从表尾向表头时使用
- 分值score
- double类型
- 从小到大排列
- 分值相同按照对象的大小排序
- 成员对象obj
- 指针,指向字符串对象
- 注意
- 表头节点的属性也全都有只是在当作表头节点时不使用
- level 层
- zskiplist表示跳跃表节点的相关信息
- header
- 指向表头的节点
- tail
- 指向表尾的节点
- level
- 记录目前跳表内,层数最大的那个节点的层数
- length
- 跳表的长度即包含节点的数量
- 包含zskiplistNode
- 注意
- header,tail两个指针定位表头表尾时间复杂度O(1)
- O(1)时间复杂度返回跳表长度
- 空间复杂度O(N)
- header
- zskiplistNode表示跳跃表节点
- 参考
- 《Redis设计与实现》