Redis 作为高性能的内存数据库,其底层数据结构设计经过深思熟虑。在有序集合(Sorted Set)的实现中,Redis 选择了跳表(Skip List),而不是常见的红黑树(Red-Black Tree)或 B+ 树(B+ Tree)。本文将详细介绍跳表的原理,并对比红黑树及 B+ 树,探讨 Redis 为什么最终选择跳表。
一、跳表简介

跳表的定义与结构
跳表是一种随机化数据结构,通过多个层级链表实现快速查找、插入和删除操作。跳表的核心思想是利用空间换时间,通过增加多层索引,使得查找时间复杂度由链表的 O(n) 降低到 O(log n)。跳表的设计相对简单,易于维护。
跳表由以下部分组成:
- 基础链表层:底层是普通链表,存储所有元素。
- 索引层:每层通过随机化算法选择部分节点,形成更高层级的链表。
- 头节点:起始节点,每层都由头节点开始。
二、红黑树与 B+ 树简介

红黑树(Red-Black Tree)
红黑树是一种自平衡二叉搜索树。每个节点具有颜色属性(红色或黑色),通过红黑规则确保树高度近似平衡,从而保证查找、插入、删除操作的时间复杂度是 O(log n)。红黑树具有自平衡机制,但实现相对复杂,需要旋转和颜色调整来维持平衡。

B+ 树(B+ Tree)
B+ 树是一种多路径平衡树,常用于数据库和文件系统。与红黑树不同,B+ 树的所有数据都存储在叶子节点,且内节点仅作为索引,不含数据。B+ 树结构复杂,适用于磁盘存储,优化磁盘I/O操作。
三、为什么 Redis 选择跳表
1. 实现简单性
跳表的插入、删除操作比红黑树和 B+ 树更加简单且易维护。红黑树需要复杂的旋转和颜色调整来保持平衡,B+ 树则需要处理节点分裂和合并。而跳表通过概率算法决定节点如何分层,大幅简化了数据结构的实现。
跳表的简单性:
- 不需要复杂的旋转和颜色调整。
- 通过随机化算法灵活实现插入和删除。
- 容易理解和维护,开发友好。
2. 范围查询效率
Redis 用于有序集合的场景,包括按分值范围查询和按排名范围查询。跳表的底层链表天然有序,能够高效地执行范围查询。
跳表的查询优势:
- 范围查询只需按链表顺序遍历,提高效率。
- 跳过无关节点,快速定位目标区间。
- 索引层级加速检索,降低复杂度。
3. 内存占用优化
跳表占用的内存相比红黑树和 B+ 树更具优势。红黑树具有额外的颜色属性和旋转维护开销,B+ 树有多个子节点和页分裂存储,而跳表通过链表和索引层优化内存使用。
跳表的内存优势:
- 动态层级分配,减少不必要的内存占用。
- 无需额外的颜色属性和维护开销。
- 更高效的内存分配和使用,灵活调整层级。
4. 高效数据插入与删除
跳表采用随机化算法进行层级分配,通过多层索引进行插入和删除操作,既保证了操作的高效性,又避免了复杂的树结构调整。
跳表的插入与删除优势:
- 随机层级生成简化了操作。
- 多层索引减少了插入和删除的复杂度。
- 稳定的操作效率,无需频繁调整平衡。
5. 内存友好型随机算法
跳表层级由随机函数生成,确保每个节点的层级分布合理,平均情况下每个节点的层数为2左右,避免极高的层级占用。此外,随机分层机制减少了内存重分配的需求,使得跳表在高并发场景下表现得更加稳定。
跳表的随机算法优势:
- 随机层级生成:通过随机数生成器确定每个节点的层级,概率性控制层级高度。
- 内存分布优化:合理分配层级,减少内存浪费。
- 减少重分配:动态调整层级,降低内存重分配的频率。
四、Redis 跳表的应用场景
1. 有序集合:排行榜系统
Redis 的 Sorted Set 数据结构常用于实现实时排行榜。其特点是元素按照分值(score)排序,并支持:
- 快速插入新数据:依据分值自动插入适当位置。
- 按分值范围查询:高效的范围查询,实时更新数据排名。
- 删除和更新:支持元素的快速删除和更新,保持有序性。
举例:游戏高分榜根据玩家分数实时更新排名,商品销售榜根据销量动态调整商品排名。
2. 基于分数范围的消息流
跳表的范围查询特性非常适合实现按时间戳或优先级过滤的消息流。例如:
- 新闻推送系统:按发布时间过滤最新消息。
- 任务优先级队列:根据任务优先级从高到低依次处理任务。
3. 实时数据裁剪
跳表通过高效的节点删除操作,实现大规模数据集的实时裁剪。定期清理过期数据,保持系统的高效运行。例如:用户访问记录中的定期清除过期条目。
五、总结
Redis 选择跳表作为有序集合的底层数据结构,主要是因为跳表具备实现简单、范围查询效率高、内存占用优化、操作高效以及内存友好型随机算法等优势。相较于红黑树和 B+ 树,跳表不仅能提供相似的时间复杂度,还简化了工程实现,提升了系统稳定性和可维护性。
Redis 跳表的优点概括:
- 实现简单:无需复杂平衡操作,易维护。
- 高效查询:底层链表有序,支持快速范围查询。
- 内存优化:动态层级分配,减少内存占用。
- 操作高效:插入、删除等基本操作高效简便。
- 随机化算法:内存友好,稳定性高。
Redis 的跳表在实时性和高效查询需求场景中表现极佳,成为了有序集合数据结构的理想选择。通过这一深度解析,希望对跳表的设计理念和实际应用有更全面的理解。