如果一个有序集合包含的元素数量比较多,又或者有序集合中元素的成员(menber)是比较长的字符串时,Redis 就会使用 skiplist(跳跃表)来作为集合的底层实现
1. 跳跃表的用途
- 有序集合键(zset)
- 集群节点中用作内部数据结构
2. 跳跃表的特点
- 每个节点中存在多个指向其它节点的指针,以达到快速访问
- 平均 O(logn) 最坏 O(n) 复杂度的节点查询
- 效率和平衡树相媲美,但是实现比平衡树更简单
3. 跳跃表的结构
Redis 的跳跃表由 redis.h/zskiplistNode 和 redis.h/zskiplist 两个结构定义,其中 zskiplistNode 结构用于表示跳跃表节点,而 zskiplist 结构则表示用于表示跳跃表的相关信息
左边的 zskiplist 结构:
- header:指向跳跃表的表头节点
- tial:指向跳跃表的表尾节点
- level:记录层数最大的那个节点的层数(表头节点层数不计算在内)
- length:跳跃表的长度,也就是跳跃表包含的节点数量