导读

前面文章【一、深入理解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”。

图示

往期文章

Redis

一、深入理解redis之需要掌握的知识点

二、redis中String和List两种数据类型和应用场景

二、redis中基础数据类型Hash、Set、SortedSet及其应用场景

Java集合

一、深入理解-Java集合初篇

二、Jdk1.7和1.8中HashMap数据结构及源码分析

三、JDK1.7和1.8HashMap数据结构及源码分析-续

四、深入理解Java中的HashMap「网易面试快答」

五、深入理解JDK1.7中HashMap哈希冲突解决方案

六、深入理解JDK1.8中HashMap哈希冲突解决方案

七、JDK1.7中HashMap扩容机制

八、JDK1.8中HashMap扩容机制
Java-IO体系

一、C10K问题经典问答
二、java.nio.ByteBuffer用法小结
三、Channel 通道
四、Selector选择器
五、Centos-Linux安装nc
六、windows环境下netcat的安装及使用
七、IDEA的maven项目的netty包的导入(其他jar同)
八、JAVA IO/NIO
九、网络IO原理-创建ServerSocket的过程
十、网络IO原理-彻底弄懂IO
十一、JAVA中ServerSocket调用Linux系统内核
十二、IO进化过程之BIO
十三、Java-IO进化过程之NIO
十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型
十五、使用Selector(多路复用器)实现Netty中Reactor主从模型
十六、Netty入门服务端代码
十七、IO进化过程之EVENT(EPOLL-事件驱动异步模型)

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

三、redis数据存储之跳跃表(SKIP LIST)相关推荐

  1. mongodb 存储过程 遍历表数据_三、redis数据存储之跳跃表(SKIP LIST)

    导读 前面文章[一.深入理解redis之需要掌握的知识点 ]中,我们对redis需要学习的内容框架进行了一个梳理.[二.redis中String和List两种数据类型和应用场景 ].[二.redis中 ...

  2. 2010-02-28 传智播客—Android(三)数据存储之三SQLite嵌入式数据库

    2010-02-28 传智播客-Android(三)数据存储之三SQLite嵌入式数据库 前两篇日志我已经总结了本地数据存储的前两种:文件和配置项.还剩下最后一种数据库存储--SQLite. 一.SQ ...

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

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

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

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

  5. 广东东软学院安卓实验报告三:“数据存储”

    广东东软学院安卓实验报告三:"数据存储" Android schoolwork entertainment app: imitating wechat Software tips: ...

  6. 搞定 Redis 数据存储原理,别只会 set、get 了

    在上一篇通过源码编译构建出可调式环境之后,想必你想更深入了解我的整体架构.当你熟悉我的整体架构和每个模块,遇到问题才能直击本源,直捣黄龙,一笑破苍穹. 我的核心模块如图 1-10. 图1-10 图 1 ...

  7. Redis数据存储解决方案

    http://www.tuicool.com/articles/77nUZn 1.背景 1.1 Redis简介 官方网站: http://redis.io/ ,Redis是REmote DIction ...

  8. redis存储新闻列表_AWS上的Redis 数据存储服务_Redis云数据存储-AWS云服务

    缓存 Redis 是实施高可用性内存中缓存的极佳选择,它可以降低数据访问延迟.提高吞吐量,并可以减轻关系数据库和应用程序或 NoSQL 数据库和应用程序的负载.Redis 能够以亚毫秒级的响应时间为频 ...

  9. 【Redis】4.Redis数据存储listsetsorted_set

    list类型 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序 list类型:保存多个数据,底层使用双向链表存储结构 ...

最新文章

  1. 推荐一款基于 SpringBoot 的接口快速开发框架
  2. 知道为啥失败么?87%的机器学习项目都是这么栽了的……
  3. ASP.NET C# 生成静态页面简单方法
  4. 学习 FPGA之前的基础知识
  5. IOS进阶之WKWebView
  6. 【Android 安装包优化】资源混淆 ( 资源混淆效果 | APK 构建流程简介 | 资源 ID 组成 )
  7. qsort归纳学习(c语言版本)
  8. 团队任务4:第二次冲刺(Beta)
  9. java删除换行符号_如何从Java中删除文件中的换行符?
  10. JMeter 做接口性能测试,YYDS!
  11. 速修复!开源企业自动化软件 Apache OFBiz 出现严重的 RCE 漏洞
  12. kubernetes视频教程笔记 (22)-存储-Secret
  13. 如何分析个股基本面_个股分析报告要分析哪些方面?股票基本面分析实例
  14. 《线性代数及其应用 第四版》习题1.4
  15. NT、Novell、Unix服务器的互连
  16. 从零开始学习java一般需要多长时间?
  17. WPS国际版2019 中文
  18. 干货分享:【IT-PMP学堂】PMP 文档与配置管理
  19. 智能鱼塘远程检测控制系统
  20. polkit启动失败_Linux MySQL 常见无法启动或启动异常的解决方案(上)

热门文章

  1. AD19——PCB铺铜方式一(多边形铺铜)
  2. 待办提醒事项app下载 待办提醒便签手机版下载
  3. 握草,这些研发事故30%我都干过!
  4. 苏州大学计算机复试面试题,【图片】18年苏州大学计算机872考研经验分享【苏州大学研究生吧】_百度贴吧...
  5. 【uniapp】结构
  6. GIS(五)——完成js版搜狗地图基本交互搜索功能
  7. AI、AR助力汽车产业链升级,车势科技领衔汽车数字零售新风潮
  8. 全球及中国无线储罐计量器行业产销前景及运营动态研究报告2021-2027年版
  9. 微信小程序:微信小程序开发
  10. UNet论文详解分析