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+树?(点击查看)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」