Redis - 跳表

跳表是什么

跳表是在双向链表什么是链表之上加多层索引构成的,相对于双向链表,支持快速查找,更新,删除,所以适用于需求灵活的场景。

查找某一个数据时,先在索引里面查找出一个大的范围,然后再下降到原始链表中精确查找。

因为加一层索引后,查找一个结点需要遍历的次数减少了,所以查找效率大大提升。【空间换时间】

针对链表长度比较大的时候,构建索引查找效率的提升就会非常明显。

 

注意⚠️:第1层链表不是一个单向链表,而是一个有序双向链表,为了方便以倒序方式获取一个范围内的元素

跳表的特点

(1) 跳表结合了链表和类似二分查找的思想;

(2) 有很多层结构,由原始链表和一些通过“跳跃”生成的链表组成;

(3) 每一层都是一个有序的链表;

(4) 最底层(Level 1)的链表包含所有元素,越上层“跳跃”的越高,元素(索引)越少;

(5) 查找时从顶层向下,不断缩小搜索范围;

(6) 上层链表是下层链表的子序列;

(7) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

跳表的搜索

  链表是有序的,但不能使用二分查找("类似"二分法)。类似二叉搜索树,我们把一些结点提取出来,作为索引。在实际开发中,原始链表中存储的可能是很大的对象,而索引结点只需要存储关键值和几个指针,其额外占用的空间可以被忽略掉。

  注意:每隔两个节点往上提升一层建立索引只是理想情况,实际上是通过随机层数K(丢硬币决定 K,随机算法)来实现。 

 

跳跃表的实现

Redis的跳跃表由redis.h/zskiplistNode和redis.h/zskiplist两个结构定义,其中zskiplistNode结构用于表示跳跃表节点,而zskiplist结构则用于保存跳跃表节点的相关信息,比如节点的数量、指向表头结点和表尾系欸但的指针等。

 

跳表的时间复杂度

  跳表各个操作的时间复杂度为:O(logn)

跳表的应用

  跳表最经典的应用就是在Redis中实现有序集合(ZSet)。

  跳表在Redis中的唯一作用也就是对该数据类型的实现,但是除了使用跳表作为有序集类型的底层数据结构外,还使用了字典来构成有序集。

  为什么使用跳表作为ZSet实现的索引,而不使用红黑树、B+树?点击查看

posted @   李若盛开  阅读(3446)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示