当前位置: 首页 > article >正文

Redis为什么用跳表实现有序集合?

Redis为什么用跳表实现有序集合?

Redis 之所以用 跳表(Skip List) 而不是 平衡树(如红黑树) 来实现有序集合(Sorted Set,zset),主要是基于以下几个考虑:

1. 跳表在范围查询上的优势

有序集合经常需要执行范围查询(如 ZRANGEZREVRANGEZRANGEBYSCORE)。跳表的结构使得它能够高效地:

  • 按分值(score)范围查找:跳表的层级索引能够快速跳跃到目标范围,然后依次遍历,时间复杂度为 O(log N) + O(m)(m 是结果数量)。
  • 按字典序遍历(分值相同时):跳表的节点是双向链表结构,范围遍历时很高效。

相比之下,红黑树等平衡树结构虽然 查找单个元素的时间复杂度也是 O(log N),但在 范围查询 时,遍历多个节点的成本较高,额外的指针操作可能导致性能下降。


2. 跳表实现简单,插入/删除操作更稳定

  • 跳表的插入/删除:平均时间复杂度是 O(log N),最坏情况下仍然是 O(log N),且实现比红黑树更简单。
  • 红黑树的插入/删除:虽然最坏情况下的时间复杂度也是 O(log N),但维护平衡(涉及旋转操作)带来额外的复杂度。

跳表的插入/删除只需要调整少量指针,不涉及复杂的旋转,容易实现,也降低了调试和维护成本。


3. 跳表在并发场景下更友好

  • Redis 是单线程的,但在某些场景下,跳表比红黑树更容易扩展到 多线程环境,因为它的结构更适合 无锁并发(Redis 本身是单线程的,所以这里的优势主要是对于扩展性和其他类似的应用)。

4. 空间占用:跳表 vs. 红黑树

  • 跳表的额外空间开销每个元素需要存多个索引层级的指针,但它并不比红黑树的父子关系指针消耗更多。
  • 红黑树每个节点通常需要存储颜色信息、父指针、左右子树指针等,对小数据量的开销更大。

Redis 通过合理的随机层级设计,使跳表的空间开销不会太高,并且跳表的结构使得它在 节省 CPU 指令 上比红黑树更高效。


5. Redis 并没有完全放弃平衡树

Redis 的 zset 结构实际上是 跳表(skiplist)+ 哈希表(dict)的组合

  • 哈希表(dict) 用于 O(1) 时间复杂度的查找,适用于 ZSCOREZINCRBY 等操作。
  • 跳表(skiplist) 用于 范围查询排序 等操作。

总结

方案查找插入/删除范围查询并发适应性实现复杂度
跳表O(log N)O(log N)O(log N) + O(m)较好简单
红黑树O(log N)O(log N)(但有旋转)O(log N) + O(m)(指针操作较多)一般复杂

由于 Redis 需要高效的范围查询、插入和删除,同时希望实现尽可能简单,跳表是 比红黑树更合适的选择


http://www.kler.cn/a/598289.html

相关文章:

  • HTML 表单处理进阶:验证与提交机制的学习心得与进度(二)
  • datawhale组队学习-大语言模型-task5:主流模型架构及新型架构
  • 2025前端面试题记录
  • 缓存监控治理在游戏业务的实践和探索
  • [python]IsaacGym安装
  • 【第14章】亿级电商平台订单系统-安全架构设计
  • MATLAB中floor函数用法
  • 【RK3588嵌入式图形编程】-SDL2-渲染文本
  • 从零构建大语言模型全栈开发指南:第一部分:数学与理论基础-1.2.2Transformer的突破性设计:自注意力机制与位置编码
  • 微服务中的服务发现
  • 中间件漏洞-Tomcat篇
  • HashRouter和BrowserRouter对比
  • uni-app jyf-parser将字符串转化为html 和 rich-text
  • 数据分析处理库-Pandas
  • 理解操作系统(一)冯诺依曼结构和什么是操作系统
  • JavaSE1.0(基础语法之运算符)
  • 【spring对bean Singleton和Prototype的管理流程】
  • Java面试黄金宝典12
  • PyTorch 面试题及参考答案(精选100道)
  • 学习Flutter:搭建第一个 Flutter 应用