mongodb 存储过程 遍历表数据_三、redis数据存储之跳跃表(SKIP LIST)
导读
前面文章【一、深入理解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)相关推荐
- mongodb 存储过程 遍历表数据_使用MongoDB存储数据
在 Ubuntu14.04 上安装 Install MongoDB Community Edition 1. Import the public key used by the package man ...
- java使用xml存储数据_聊一聊 Redis 数据内部存储使用到的数据结构
Redis 数据库虽然一直都在使用,但是对其内部存储结构之类的,都没有研究过,哪怕是面试的时候都没有准备过这方面的东西.最近在看一门网课,里面有讲到过这一块的内容,结合了<Redis 设计与实现 ...
- mongodb 存储过程 遍历表数据_一个mongodb存储过程
functionProhibitNumbers(datetype,startdate,enddate,org,pageindex,pagesize) {//违规检查-数量控制 ProhibitNumb ...
- mongodb 存储过程 遍历表数据_mongodb查看数据库和表的信息
mongodb查看数据库和表的方法比较简单,在为这里推荐使用stats的方法,直观并且详细. 1.查看数据库 db.stats(); 1 输出: { "db" : "si ...
- mongodb 存储过程 遍历表数据_mongodb推荐存列表字段还是多条记录?
在 sql 下, 方案2更好. 在 mongo 下, 方案1更好. 不知道你的这个项目中有没有用户权限组的概念. 如果有权限组的话, 就是一个权限组的 collection 里面, 每个权限下保存了一 ...
- 算命数据_未来的数据科学家或算命精神向导
算命数据 Real Estate Sale Prices, Regression, and Classification: Data Science is the Future of Fortune ...
- 大数据_什么是数据中台?
目录 一.数据中台的定义 二.数据中台必备的是个核心能力 三.数据中台VS业务中台 四.数据中台VS数据仓库 五.数据中台VS现有信息架构 六.数据中台的业务价值与技术价值 一.数据中台的定义 数据中 ...
- 学习笔记-Redis设计与实现-跳跃表
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的. 跳跃表支持平均O(logN).最坏O(N)复杂度的节点查找,还可以通过顺序性操 ...
- redis底层数据结构之跳跃表
redis底层数据结构之跳跃表 redis 的zset有序连表为啥选择用跳跃表? 我们要思考一问题,首先多问问自己为什么,才容易理解它,ps:这是个人观点.首先我们选择的数据结构和算法原因有以下几种: ...
最新文章
- 2022-2028年中国TPE手套行业市场全景调查及发展策略分析报告
- IDEA的查询引用、调用关系图的功能
- 一次系统调用开销到底有多大?
- vue项目中所使用的element-UI / echarts
- 利用正则表达式截取特定字符中间字符
- linux加入微软,微软正式加入Linux基金会
- Codeforces Round #563 (Div. 2) A. Ehab Fails to Be Thanos
- OpenLayers 绘制,选中,鼠标悬浮
- 弹性公网IP ping不通?
- 项目质量管理的三个重要流程
- mysql过期数据_mysql过期数据如何删除
- QQ跳转浏览器php代码,QQ微信域名预防封禁强制跳转至浏览器打开PHP源代码下载...
- 选择题快速求解AOE网的关键路径
- 极米、当贝、坚果3000内的投影仪有什么推荐?
- mysql in 分组,基于mysql实现group by取各分组最新一条数据
- 批量复制到花瓣网上图片素材的原图
- Intent传递数据的方法
- 使用wxPython开发带有GUI图形界面的Python程序简单实例
- 西门子DR系统怎么进计算机管理器,西门子Select DR操作规程
- 实现一个博客系统(前端页面设计)
热门文章
- DPDK如何释放大页内存(巨页内存hugepage)
- windows10安装Visual Studio 2017
- python gui编程 自动化框架_使用Python进行GUI操作自动化
- python beautifulsoup报错bs4 FeatureNotFound Couldnot find a tree builder with the features
- mysql操作语句(简单笔记)
- RecycleView的网格样式
- 小米笔记本 镜像_华为的裤衩——小米互传
- python具备的功能是_用了Python这么多年,揭秘Python不为人知的7大功能和特点!...
- 【Unity开源项目精选】UniRx:Unity中的响应式编程
- Unity中设置Transform的forward/up/right旋转异常问题