Redis只在两个地方用到了跳跃表,一个是实现有序集合键(zset),另一个是在集群节点中用作内部数据结构,除此之外,跳表在Redis里面没有其他用途。

但是为什么用跳表而不用红黑树呢?猜想如下:
1)在做范围查找的时候,平衡树比skiplist操作要复杂。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现。而在skiplist上进行范围查找就非常简单,只需要在找到小值之后,对第1层链表进行若干步的遍历就可以实现。
2)平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速。
3)从内存占用上来说,skiplist比平衡树更灵活一些。一般来说,平衡树每个节点包含2个指针(分别指向左右子树),而skiplist每个节点包含的指针数目平均为1/(1-p),具体取决于参数p的大小。如果像Redis里的实现一样,取p=1/4,那么平均每个节点包含1.33个指针,比平衡树更有优势。
4)查找单个key,skiplist和平衡树的时间复杂度都为O(log n),大体相当;而哈希表在保持较低的哈希值冲突概率的前提下,查找时间复杂度接近O(1),性能更高一些。所以我们平常使用的各种Map或dictionary结构,大都是基于哈希表实现的。
5)从算法实现难度上来比较,skiplist比平衡树要简单得多。

结合书籍《redis设计与实现(第二版)》里面的一段描述进行理解:

redis为什么选择了跳跃表而不是红黑树相关推荐

  1. redis为什么采用跳表而不是红黑树详解

    今天早上看到这样redis的面试题:redis为什么采用跳表而不是红黑树?? 面试题答案: 在做范围查找的时候,平衡树比skiplist操作要复杂.在平衡树上,我们找到指定范围的小值之后,还需要以中序 ...

  2. 面试官:为何Redis使用跳表而非红黑树实现SortedSet?

    知道跳表(Skip List)是在看关于Redis的书的时候,Redis中的有序集合使用了跳表数据结构.接着就查了一些博客,来学习一下跳表.后面会使用Java代码来简单实现跳表. 什么是跳表 跳表由W ...

  3. HashMap为什么用红黑树而不用跳表?redis的zset为什么用跳表而不用红黑树?

    问题引入 前些天在思考zset为什么用跳表而不用红黑树时,自然想到了HashMap为什么用红黑树而不用跳表,做了一些查询和考虑,以此记录结果 redis的zset为什么用跳表而不用红黑树? 1.跳表的 ...

  4. Redis内部数据结构-跳跃表

    今天学习了跳跃表,记录一下下~ 一.跳跃表简介 跳跃表是一种随机化数据结构,基于并联的链表,其效率可以比拟平衡二叉树,查找.删除.插入等操作都可以在对数期望时间内完成,对比平衡树,跳跃表的实现要简单直 ...

  5. 数据结构-动态查找树表与平衡二叉树 红黑树简单介绍

    参考资料 数据结构(严蔚敏) 大话数据结构 百度百科 https://blog.csdn.net/lpp0900320123/article/details/39524947 https://mp.w ...

  6. 底层实现红黑树_【单选题】下列数据结构中,哪一个是ArrayList类的底层实现( ) A. 数组结构 B. 链表结构 C. 哈希表结构 D. 红黑树结构...

    [多选] 影响电极电位大小的因素有(). [判断题] 电化学除油需要外接电源,其采用原理只有气泡的搅拌作用. [多选] 油污的种类一般包括(). [多选] "高酸低铜"镀铜液的特点 ...

  7. Redis 为什么这么快? Redis 的有序集合 zset 的底层实现原理是什么? —— 跳跃表 skiplist

    Redis有序集合 zset 的底层实现--跳跃表skiplist Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 ...

  8. redis(五)跳跃表

    一:基本概念 跳跃表是一种随机化的数据结构,在查找.插入和删除这些字典操作上,其效率可比拟于平衡二叉树(如红黑树),大多数操作只需要O(log n)平均时间,但它的代码以及原理更简单.跳跃表的定义如下 ...

  9. Redis - 跳跃表

    一.跳跃表简介 跳跃表(skiplist)是一种随机化的数据结构,由 William Pugh 在论文<Skip lists: a probabilistic alternative to ba ...

最新文章

  1. PV-RAFT:用于点云场景流估计的点体素相关场(CVPR2021)
  2. .NET Core Generic Host项目使用Topshelf部署为Windows服务
  3. 澎思科技马原:AI为基,IoT为翼,加速人工智能普惠丨MEET2021
  4. 2021春季每日一题【week5 未完结】
  5. 编写junit 测试_使用JUnit和Repeat注​​释编写有效的负载测试
  6. 学好Python爬取京东知乎价值数据
  7. Java并发编程 - 显示锁Lock和ReentrantLock
  8. Could not find leader nimbus
  9. android 内存对齐,Go struct 内存对齐
  10. mysql存储过程输出多个参数值_MySQL 存储过程返回多个值
  11. 用VBA编程时,如何对当前的工作表进行选定[收集]
  12. Stable Region Correspondences Between Non-Isometric Shapes
  13. 德江多措施推进大数据应用“智慧德江”建设
  14. 拓端tecdat|如何用R语言在机器学习中建立集成模型?
  15. 一张图读懂“云栖大会·武汉峰会”发布的阿里云AI产品体系
  16. ubuntu darknet GPU版
  17. c语言经典100例对考研有用吗,考研数学经验,没用算这学长输
  18. 分享几点论文降重的方法(干货)
  19. C# 标准ASCII 码表
  20. Keil暗色模式配置文件

热门文章

  1. 享学独立站:Logo设计理念
  2. 给你一个水杯你怎么测
  3. Quasi- likelihood function
  4. eclips开发工具的使用
  5. 抖音可以传多长的视频?
  6. 小程序如何引导添加个人微信号
  7. chatgpt:栅格化原理和代码
  8. PAT1023 组个最小数给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小例如:给定两个0两个1三个5一个8得到的数字就是10015558
  9. Linux用户态与内核态通信的几种方式(待完善)
  10. 【C语言必经之路——第13节】C语言中的数据类型详解