【Redis】Redis跳表与实现源码解析(Redis专栏启动)

news2024/11/26 10:33:30

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 CSDN博客专家/后端领域优质创作者/内容合伙人、InfoQ签约作者、阿里云专家/签约博主、51CTO专家 🏆

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

金融公司的防资损方法论、代码与实践。

本文目录

本文导读

一、什么是跳表

1、跳表的原理

2、跳表的特点

3、跳表在Redis中的使用

二、Redis的跳表实现原理

三、跳表在Redis中的应用

总结


本文导读

本文介绍Redis跳表与实现源码解析,包括什么是跳表,跳表的数据结构原理、特点,到Redis源码中的跳表实现。

一、什么是跳表

1、跳表的原理

跳表(skiplist)是一种有序的数据结构,它可以通过维护指向每个节点中其他节点的多个指针来快速访问节点。简单来说,跳表是通过向双向链接列添加多个索引而形成的。

与双向链接列表相比,它支持快速搜索、更新和删除,因此适用于需求灵活的场景。

对于双向链表,即使存储在链接列表中的数据是有序的,如果我们想在其中找到某个数据,它也只能从头到尾遍历链接列表,反之亦然。这样搜索效率将非常低,时间复杂度将非常高,达到O(n)。

跳表在搜索某个数据时,首先在索引中找到一个较大的范围,然后再放到原始链接列表中进行精确搜索。因为在添加一层索引后,搜索节点的次数减少了,因此搜索效率大大提高,是典型的空间换时间。

当链表长度相对较大时,索引构建效率将显著提高。第一级链表不是单向链表,而是有序的双向链表。为了以相反的顺序获得范围中的元素。

2、跳表的特点

1、跳表结合了链表和类似的二分搜索思想;

2、结构有很多层,由原始链接列表和一些通过“跳转”生成的链表组成;

3、每一层都是一个有序的链表,最低级别(级别1)的链接列表包含所有元素。“跳跃”越高,元素(索引)越少;上链表是下链表的子序列;

4、搜索时,搜索顺序从上到下缩小;

5、每个节点包含两个指针,一个指向同一链接列表中的下一个元素,另一个指向下一级别的元素。

3、跳表在Redis中的使用

Redis使用跳表作为有序集合 zset 的底层实现之一。如果有序集合包含大量元素,或者如果有序集合中元素的成员是相对较长的字符串,Redis将使用跳表作为有序集合的底层实现。

二、Redis的跳表实现原理

Redis的跳表由两个结构定义:zskiplistNode和zskiplist。

zskiplistNode结构用于表示跳表节点

zskiplist结构用于存储关于跳表节点的信息,例如节点数量,以及指向页眉节点和页脚节点的指针。

上图绿色部分就是的是 zskiplist 结构

Header:指向跳表的头节点。通过该指针程序定位头节点的时间复杂度为O(1);

Tail:指向跳表的尾部节点。通过该指针程序定位尾部节点的时间复杂度为O(1);

Level:记录当前跳表中级别最大的节点的级别(不包括表头节点的级别);使用该属性,可以获得时间复杂度为O(1)内具有最高层高度的节点的层数

Length:记录跳表的长度,即当前包含在跳表中的节点数(不包括头节点)。使用此属性,程序可以在O(1)时间复杂度内返回跳表的长度。

typedef struct zskiplistNode {
    // 层
    struct zskiplistLevel {
        // 前进指针
        struct zskiplistNode *forward;
        // 跨度
        unsigned int span;
    } level[];
    // 后退指针
    struct zskiplistNode *backward;
    // 分值
    double score;
    // 成员对象
    robj *obj;
} zskiplistNode;

zskiplistNode 结构 包含以下属性:

Level:节点的每一层都标记有L1、L2、L3等。L1表示第一层,L2表示第二层,依此类推。每一层有两个属性:前向指针和跨度。前向指针用于访问表末尾的其他节点。跨度记录前向指针指向的节点与当前节点之间的距离(跨度越大,距离越远)。在上图中,行上带有数字的箭头表示向前指针,该数字表示跨度。当程序从页眉遍历到页脚时,访问将跟随层的前向指针。

Backward:标记为BW的节点的向后指针,指向当前节点的前一个节点。当程序从页脚遍历到页眉时,使用返回指针

Score:每个节点的1、2、3是该节点保存的得分,节点根据其保存的分数从小到大排列。

Obj:每个节点中的 obj 是节点保存的成员对象。

typedef struct zskiplist {
    // header和tail指针分别指向跳表的表头和表尾节点
    // 程序定位表头节点和表尾节点的复杂度为O(1)。
    structz skiplistNode *header, *tail;
    // length属性来记录节点的数量,O(1)复杂度内返回跳表的长度。
    unsigned long length;
    // 表中层数最大的节点的层数
    int level;
} zskiplist;

三、跳表在Redis中的应用

Redis使用跳表作为 zset 的底层实现之一,跳表在Redis中的唯一作用也就是对该数据类型的实现。

如果有序集合包含大量元素,或者如果有序集合中元素的成员是相对较长的字符串,Redis将使用跳表作为有序集合键的底层实现。

原因是跳表向链接列表添加了多级索引,以提高搜索效率。然而,它是一种空间到时间的方案,这将不可避免地带来一个问题——索引占用内存。

Redis读取内存中的数据,不涉及IO。由于读取内存中的数据所花费的时间是从磁盘IO读取数据所花费时间的百万分之一,因此它使用了一个跳表,并使用了空间换时间,这一点易于实现,可以提高查询效率。

原始链接列表可能存储大型对象,而索引节点只需要存储键值和几个指针,不需要存储对象。因此,当节点本身较大或元素数量较大时,其优点将不可避免地被放大,而其缺点可以被忽略。

总结

本文介绍Redis跳表与实现源码解析,包括什么是跳表,跳表的数据结构原理、特点,到Redis源码中的跳表实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat下载和安装

下载 Tomcat官网网址 我选择的是8,根据自己需要选择不同版本 选择64位下载 下载有点慢,等一会儿就行 安装 首先确认安装了JDK:命令行窗口输入java -version 配置Tomcat环境变量 配完之后验证是否成功。 winR->cmd->输入startup.bat…

什么是社交新零售?社交新零售的底层商业又是逻辑是什么?

一千个品牌商心中,有一千个新零售——自从马云2016年10月提出新零售的概念后,电商平台、传统商超、电商品牌、线下品牌,汹涌而至,都想搭上“新零售快车”。 新零售模式是依靠于大数据的开发应用,国内新零售模式发展多年…

Node.js快速入门

一、简介 1、什么是Node.js 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。 2、Node.js有什么用 如果你是一个前端程序…

【有料c++题目周刊 | 第一期】希腊诸神

文章目录第一题:珀耳修斯点金题目描述输入描述输入示例输出描述输出示例解题思路&C题解第二题:女神赫拉题目描述输入描述输入示例输出描述输出示例解题思路&C题解第一题:珀耳修斯点金 题目描述 某希腊神话故事中,有一个…

物联网通信技术|课堂笔记week2-2|9月7日·21日

sudo ifconfig bridge101 hw ether 9e:3e:53:38:45:66 目录 Linux网络管理命令 (1)route (2)ip (3)netstat (4)ping ​​​​​​两台电脑连起来后ping不通? (5)telnet (6)ssh (7)wget Linux网络管理命令 (1)route 路由为互联网的中转站 静态路由 动态路由 rout…

Go代码审计学习(一)

文章目录Vulnerability-goapp/assets// 根目录/login/new/top/profile/profile/edit/upload/post /timeline/timeline/searchpost/adminconfirm /adminlogin /adminusersCSRF网上有关Go的代码审计好少哇,能找到的文章也不多,害,没办法也得学 …

网络协议—应用层的HTTP协议

URL,叫作统一资源定位符。之所以叫统一,是因为它是有格式的。HTTP 称为协议,www.163.com 是一个域名,表示互联网上的一个位置。正是因为这个东西是统一的,所以当你把这样一个字符串输入到浏览器的框里的时候&#xff0…

软件测试是要学习什么技能?

推荐阅读: 2022年简历石沉大海,软件测试行业当前找工作有多难? [内部资源] 想拿年薪30W的软件测试人员,这份资料必须领取~ 在确定软件开发可行的状态下,对软件是要实现的各个功能做到详细分析。要求分析阶段是一个很…

两起并购!深兰科技完成自动驾驶新能源车产业生态链布局

近日,深兰科技集团全资控股的熊猫汽车(上海)有限公司分别与一汽凌源、湖南加立减新能源科技正式签约,完成了对这两家公司的并购,为企业自动驾驶新能源汽车产业生态链的建设蓝图添上了浓重的一笔。 此次被深兰科技并购的一汽凌源汽车制造有限公…

Java二维数组拓展练习

例 1 对角线输出&#xff1a; 已知一个n*n的矩阵&#xff08;n<20&#xff09;&#xff0c;把矩阵二条对角线上的元素值加上10&#xff0c;然后输出这两条新对角线上的所有元素之和。 注意当n为奇数时两条对角线交叉的那个元素改变时只需要改变一次&#xff0c;累加的时候…

46.for循环嵌套之九九乘法表

46.for循环嵌套之九九乘法表 文章目录46.for循环嵌套之九九乘法表1. 目标任务2. 完成第1行输出2. 分析前3行规律3. 编写第1行代码4. 编写前2行代码5. 调整输出格式6. 完成总代码1. 目标任务 本节的任务是利用for循环嵌套编写九九乘法表。 1*11 1*22 2*24 1*33 2*36 3*39 1…

语音识别之语音激活(VAD)检测(一)

导读 语音激活检测(Vioce Activation Detection)简称VAD&#xff0c;用来检测语音信号是否存在。VAD技术在语音领域中应用非常的广泛&#xff0c;在语音识别中我们可以对长语音通过VAD来检测出语音信号的空隙&#xff0c;通过这个空隙来分割语音&#xff0c;将长语音切分成短语…

正大国际期货:如何摆脱炒黄金期货被套单?

投资失败无非两点&#xff1a;一是自身原因&#xff0c;自己没有经验&#xff0c;盲目的操作肯定会造成亏损&#xff1b;二是指导老师的实力问题&#xff0c;指导老师对行情的方向把握不准&#xff0c;经常喊反弹&#xff0c;造成你的亏损。想要走得快&#xff0c;就独自上路&a…

Python每日一练 09——多文件操作

Python每日一练 09——多文件操作 文章目录Python每日一练 09——多文件操作一、单文件拆分为多个文件二、多文件合并为单文件1、获取数据文件名2、获取股票名列表3、读单支股票数据4、读多支股票数据5、多文件中数据合并到一个文件一、单文件拆分为多个文件 我们写一个txt文件…

数字图像处理(入门篇)九 图像数据预处理之滤波

目录 1 模板运算 &#xff08;1&#xff09;模板卷积 &#xff08;2&#xff09;模板排序 2 均值滤波 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;结果图 3 高斯滤波 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;结果图 4 中值滤波 &#…

IB数学HL/SL考试大纲简单介绍

IB数学难度怎么样&#xff1f;IB数学内部评估和外部评估是怎么评分的&#xff0c;IB数学HL和SL的考试大纲&#xff1f; 下面介绍IB数学框架体系IB数学SL考试大纲 SL数学为必修课 考试内容相对比较基础 代数&#xff08;Algebra&#xff09;&#xff1a;涉及数列问题&#xff…

CentOS虚拟机搭建Hive环境

注&#xff1a;本文是对 https://www.bilibili.com/video/BV1CU4y1N7Sh 的实践。 关于如何搭建Hadoop集群&#xff0c;请参考我另一篇文档。 环境 CentOS 7.7JDK 8Hadoop 3.3.0Hive 3.1.2 准备 确认Hadoop的 etc/hadoop/core-site.xml 文件包含如下配置&#xff1a; <…

3D建模师做多了女人会不会找不到老婆?次世代美少女战士建模流程讲解

什么是次世代&#xff1f; 次世代是个舶来语&#xff0c;“次世代游戏”指代和同类游戏相比下更加先进的游戏&#xff0c;即“下一代游戏”。 次世代是利用高模烘焙的法线贴图回帖到低模上&#xff0c;让低模在游戏引擎里可以及时显示高模的视觉效果。模型面数比较高&#xf…

Python实现PSO粒子群优化卷积神经网络CNN回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

学完这篇,再不怕防火墙NAT策略问题

Q&A 1、配置了nat server后Tracert防火墙上的global地址&#xff0c;显示信息是什么? 无论具有Inside地址的设备在防火墙内部有多少跳&#xff0c;Tracert时全部显示nat server的global的地址。如果有3跳&#xff0c;则显示3次global地址。 2、nat server和destination-n…