导读

前面文章【一、深入理解redis之需要掌握的知识点 】中,我们对redis需要学习的内容框架进行了一个梳理。【二、redis中String和List两种数据类型和应用场景 】、【二、redis中Hash、Set、SortedSet应用场景 】两篇文章我们对redis中String、List、Hash、Set、SortedSet五种数据类型做了一下讲解,并且对他们各自的应用场景进行了介绍。

本篇文章我们将要深入学习支撑SortedSet排序背后的数据结构,跳跃表;

如果大家在工作、学习、面试中针对redis还有什么疑问或者其他问题,可以评论区告诉我。
为了保证可以连续不间断的获取最新的技术分析及讲解,建议关注本头条号【程序猿的花果山】。

解释

一、

在redis的SortedSet中使用双向链表存储数据,并按照权重(Score分值)进行排序,但是它用空间换时间的方式实现了跳跃表的概念。

二、

如果此时SET只是一个单纯的双向链表,那么当现在要新插入数据“A1-8”时候,他需要从双向链表的头部元素U开始,从左向右寻找,直到找到“W1-7”和“X1-10”之间然后插入。

此时他查找的时间复杂度是O(n),插入的时间复杂度为O(1)。之所以插入的时间复杂度为O(1)因为他只需要改变“W1-7”元素的next指针到“A1-8”,“A1-8”的next指针到“X1-10”。(注意:要理解这个操作需要先理解链表,请自行了解,链表的优缺点是:插入、删除快查找慢)

三、

在redis的SortedSet中使用了跳跃表逻辑的双向链表(注意去看跳跃双向链表的论文)。当此时要插入新数据“A1-8”时,他从双向链表的头部元素“U1-1”开始自上而下开始寻找。

他首先判断当前“A1-8”的值大于“U1-1”的值,因此应该向右侧看,因此开始自上而下的开始找他的跳跃索引;

当他找到“U3”时候,发现“U3”的右边都指向空;那么继续向下寻找找到“U2”,发现“U2”右侧指向“W2”,然后跳跃到“W2”节点;

此时用“W2”的根节点“W1-7”的值与“A1-8”进行比较发现还需要自己向右侧看;

此时再自上而下遍历“W1-7”的跳跃索引“W2”,发现“W2”右侧节点指向“Y2”,然后跳跃到“Y2”节点;

此时用“Y2”的根节点“Y1-12”的值与“A1-8”进行比较,发现需要向左侧看,因此跳跃到“X1-10”节点;

然后再用“X1-10”的值与“A1-8”的值进行比较,发现需要继续向左看,然后跳跃到“W1-7”节点:然后再进行比较发现“A1-8”的值大于“W1-7”的值,所以把“A1-8”插入到“W1-7”与“X1-10”之间。

四、

当跳跃链表要插入的新数据“A1-8”找到要插入的位置并插入到“W1-7”和“X1-10”之间后,他开始用投硬币的方式构建自己的跳跃索引。

如果此时他投硬币的结果为0,那么直接结束构建跳跃索引的过程;

如果此时他投硬币的结果为1,那么他创建一个自己的跳跃索引“A2”,并通过递归查找“A1-8”的左侧和右侧,直到找到有2层跳跃索引的元素“W1-7”和“Y1-12”,并把“A1-8”的跳跃索引“A2”插入到“W1-7”和“Y1-12”的各自的2层跳跃索引“W2”和“Y2”中间,此时“A1-8”的2层跳跃索引“A2”构建完毕;

此时继续通过投硬币的方式判断是否继续构建3层索引,如果投硬币的结果为0则直接结束构建跳跃索引,如果投硬币的结果为1,那么继续构建“A1-8”的第三层索引“A3”;

如此循环往复,构建第4层,第5层跳跃索引,直到投硬币结果为0而结束跳跃索引的构建;

五、

注意:当构建每层次跳跃索引时,它只会寻找具备相同层次的跳跃索引的元素。例如:如果“A1-8”要构建他的第三层跳跃索引“A3”,那么他向左向右递归时候,最终“A3”的右侧指向空,“A3”的左侧指向同样具备第三层跳跃索引的元素“U1-1”的跳跃索引“U3”。

图示

如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒

mongodb 存储过程 遍历表数据_三、redis数据存储之跳跃表(SKIP LIST)相关推荐

  1. mongodb 存储过程 遍历表数据_使用MongoDB存储数据

    在 Ubuntu14.04 上安装 Install MongoDB Community Edition 1. Import the public key used by the package man ...

  2. java使用xml存储数据_聊一聊 Redis 数据内部存储使用到的数据结构

    Redis 数据库虽然一直都在使用,但是对其内部存储结构之类的,都没有研究过,哪怕是面试的时候都没有准备过这方面的东西.最近在看一门网课,里面有讲到过这一块的内容,结合了<Redis 设计与实现 ...

  3. mongodb 存储过程 遍历表数据_一个mongodb存储过程

    functionProhibitNumbers(datetype,startdate,enddate,org,pageindex,pagesize) {//违规检查-数量控制 ProhibitNumb ...

  4. mongodb 存储过程 遍历表数据_mongodb查看数据库和表的信息

    mongodb查看数据库和表的方法比较简单,在为这里推荐使用stats的方法,直观并且详细. 1.查看数据库 db.stats(); 1 输出: { "db" : "si ...

  5. mongodb 存储过程 遍历表数据_mongodb推荐存列表字段还是多条记录?

    在 sql 下, 方案2更好. 在 mongo 下, 方案1更好. 不知道你的这个项目中有没有用户权限组的概念. 如果有权限组的话, 就是一个权限组的 collection 里面, 每个权限下保存了一 ...

  6. 算命数据_未来的数据科学家或算命精神向导

    算命数据 Real Estate Sale Prices, Regression, and Classification: Data Science is the Future of Fortune ...

  7. 大数据_什么是数据中台?

    目录 一.数据中台的定义 二.数据中台必备的是个核心能力 三.数据中台VS业务中台 四.数据中台VS数据仓库 五.数据中台VS现有信息架构 六.数据中台的业务价值与技术价值 一.数据中台的定义 数据中 ...

  8. 学习笔记-Redis设计与实现-跳跃表

    跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的. 跳跃表支持平均O(logN).最坏O(N)复杂度的节点查找,还可以通过顺序性操 ...

  9. redis底层数据结构之跳跃表

    redis底层数据结构之跳跃表 redis 的zset有序连表为啥选择用跳跃表? 我们要思考一问题,首先多问问自己为什么,才容易理解它,ps:这是个人观点.首先我们选择的数据结构和算法原因有以下几种: ...

最新文章

  1. 2022-2028年中国TPE手套行业市场全景调查及发展策略分析报告
  2. IDEA的查询引用、调用关系图的功能
  3. 一次系统调用开销到底有多大?
  4. vue项目中所使用的element-UI / echarts
  5. 利用正则表达式截取特定字符中间字符
  6. linux加入微软,微软正式加入Linux基金会
  7. Codeforces Round #563 (Div. 2) A. Ehab Fails to Be Thanos
  8. OpenLayers 绘制,选中,鼠标悬浮
  9. 弹性公网IP ping不通?
  10. 项目质量管理的三个重要流程
  11. mysql过期数据_mysql过期数据如何删除
  12. QQ跳转浏览器php代码,QQ微信域名预防封禁强制跳转至浏览器打开PHP源代码下载...
  13. 选择题快速求解AOE网的关键路径
  14. 极米、当贝、坚果3000内的投影仪有什么推荐?
  15. mysql in 分组,基于mysql实现group by取各分组最新一条数据
  16. 批量复制到花瓣网上图片素材的原图
  17. Intent传递数据的方法
  18. 使用wxPython开发带有GUI图形界面的Python程序简单实例
  19. 西门子DR系统怎么进计算机管理器,西门子Select DR操作规程
  20. 实现一个博客系统(前端页面设计)

热门文章

  1. DPDK如何释放大页内存(巨页内存hugepage)
  2. windows10安装Visual Studio 2017
  3. python gui编程 自动化框架_使用Python进行GUI操作自动化
  4. python beautifulsoup报错bs4 FeatureNotFound Couldnot find a tree builder with the features
  5. mysql操作语句(简单笔记)
  6. RecycleView的网格样式
  7. 小米笔记本 镜像_华为的裤衩——小米互传
  8. python具备的功能是_用了Python这么多年,揭秘Python不为人知的7大功能和特点!...
  9. 【Unity开源项目精选】UniRx:Unity中的响应式编程
  10. Unity中设置Transform的forward/up/right旋转异常问题