Redis底层数据结构详解

article/2025/9/13 16:29:47

Redis底层数据结构详解

我们知道Redis常用的数据结构有五种,String、List、Hash、Set、ZSet,其他的集中数据结构基本上也是用这五种实现的,那么,这五种是Redis提供给你的数据结构,这五种数据结构式怎么实现的,你知道么?底层的底层,你有了解过吗?
在这里插入图片描述

这些是五种数据结构底层使用的数据结构,我们可以看到,有很多底层使用了两种数据结构,比如set在元素较少,且都是数字的情况下会使用整数列表,数据增加会变成哈希表。那么这些底层的数据结构,你又了解多少呢?

这个问题我们先放一下,你有没有一个疑问,这些底层都有着不同的数据结构,那么redis整体的数据结构是什么呢?举个例子,我们现在有一个key对应的value是list类型的,对应的是一个双向链表,那么,我首先要找到这个key,才可以找到这个双向链表噻?

全局哈希表

其实,在redis中,是有一个大的哈希表的,所谓哈希表就是类似的长数组,上面每一个空间,我们都可以看做一个哈希桶。

在这里插入图片描述

每一个key经过Redis内部的hash算法之后都会算出一个位置,这个位置对应一个哈希桶。注意,这个过程可是很快的哈,O(1)的时间复杂度,因为只是计算出一个内存地址,直接寻址就可以了。然后这个key就存到了这个hash桶上面了,这个哈系桶上面保存的是引用,不是真实的对象,就好像哈希桶里面保存的是这个key家的地址(内存地址)。这样就可以用O(1)的时间复杂度完成查找操作了,因为用key去查找value的时候,只需要在经过依次hash能马上找到哈希桶,就能定位到这个键值对的内存地址了。

那么有一个问题,hash算法不能保证所有的key经过算法出来的值都不一样,就是会有哈希冲突的存在,就是两个key放到了同一个桶中,这可怎么办呢?

Redis使用了链表来解决这个问题,就是两个在一个桶中的元素,会用一个next指针连在一起,经过hash之后找到一个键值对之后,对比不是,根据next指针再找下一个比对即可。
在这里插入图片描述

那么当元素越来越多之后,一个哈希桶所对应的链表会越来越长,我们知道链表上的遍历时间复杂度是O(n),会严重影响性能,Redis这种追求快的数据库是绝对不能够容忍的,那么要怎么处理,就是rehash操作。

rehash和渐进式rehash操作

redis会在内部从新建一个长度为原始长度2倍的空哈希表,然后原哈希表上的元素重新rehash到新的哈希表中去,然后我们使用新的哈希表即可。

那么,这样还是有问题,要知道redis中存储的数据可能是成百万上千万的,我们重新rehash一次未免太耗时了吧,因为redis中操作大部分是单线程的,这个过程可能会阻断其他操作很长时间,这是不能忍受的,那么要怎么处理呢。

redis是采用了渐进式rehash的操作,就是会有一个变量,指向第一个哈希桶,然后redis每执行一个添加key,删除key的类似命令,就顺便copy一个哈希桶中的数据到新的哈希表中去,这样溪水长流的操作,不会影响什么性能,直到所有的数据都被重新hash到新的哈希表中。

那么在这个过程中,当然再有写的操作,会直接把数据放到新的哈希表中,保证旧的肯定有copy完的时候,如果这段时间对数据库的操作较少,也没有关系,redis内部也有定时任务,每隔一段时间也会copy一次。

压缩表

压缩表是一种Redis开发用来节省内存的顺序性存储的表结构,我们知道数组这种数据结构,每一个空间的大小都是一样的,这样我们存储较小元素节点的时候就会造成内存的浪费,而压缩链表可以做到每一个元素的节点的大小都不一样。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUnkffte-1620315354916)(C:\Users\win10\AppData\Roaming\Typora\typora-user-images\image-20210506233133717.png)]

压缩列表实际上类似于一个数组,数组中的每一个元素都对应保存一个数据。和数组不同的是,压缩列表在表头有三个字段 zlbytes、zltail 和 zllen,分别表示列表长度、列表尾的偏移量和列表中的 entry 个数;压缩列表在表尾还有一个 zlend,表示列表结束。

跳表

关于跳表,我写了一篇专门的文章介绍,地址 https://yanghang.blog.csdn.net/article/details/116432604

最后附上Redis底层数据结构的查询时间复杂度

在这里插入图片描述

写在最后,推荐《Redis的设计与实践》这本书,还有蒋德钧的《Redis核心技术与实战》专栏。如果想系统的学习Redis的人,不妨看一下。


http://chatgpt.dhexx.cn/article/FNyvGbgP.shtml

相关文章

Redis的五种基础数据结构

Redis的五种基础数据结构 Redis有5种基础数据结构,分别为:String(字符串),list(列表),hash(字典),set(集合)和zset(有序集合)。 1.String(字符串) 字符串的结构 字符串String是Redis最简单的数据结构,它的内部表示…

Redis的数据结构

一、redis的数据结构 1、String字符串类型 Redis的String能够表示字符串、整数、浮点数三种值的类型 应用场景: 普通的赋值使用incr、decr命令进行递增和递减统计数据。用于实现乐观锁watch(事物)setNx实现分布式锁 底层数据类型: // 数据结构 stru…

为了拿捏 Redis 数据结构,我画了 40 张图(完整版)

大家好,我是小林。 Redis 为什么那么快? 除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis 能高效的处理。…

IDEA 配置Services面板

IDEA中的services窗口是一个管理所有服务的地方,特别是在使用spring cloud项目开发中,对多个微服务的管理非常实用。 配置方式一: 在IDEA中可通过配置将services窗口面板显示出来。 配置方式二: 找到项目.idea目录下worksp…

如何在IDEA配置Tomcat

1、点击RUN下拉的Edit Configurations 2、点击左上角号,下拉找到Tomcat Server,选择Local 3、 配置Tmcat信息 4、点击Deployment,选择右边的号,选择Artifict 5、Application context这里只写个“/”就可以了 6、点击Apply,然后返回…

idea配置代理服务器

1、查看代理服务器ip和端口 使用http代理 2、idea中配置代理服务器 选择File --> Settings --> 搜索HTTP Proxy --> 选择Manual proxy configuration --> 选择HTTP输入ip和端口 --> 点击Apply 3、配置jvm启动参数 -Djava.net.useSystemProxiestrue 完成!

IDEA配置安卓环境

IDEA是JetBrains公司推出的Java集成开发环境 ,这学期又开了安卓课,少不了安卓环境,不过android stdio是完全支持安卓的,不适合开发java项目,作为小白,我觉得IDEA一个软件就够了,当然&#xff0c…

idea配置maven仓库

1、去达内开发文档服务器下载对应插件 达内开发文档服务器 找到配置文件下载 ,下载阿里云Maven创库配置 以上下载压缩包先不动 2、创建maven项目 打开idea file-----new project 点击左侧选择maven然后next 3、然后查看对应的maven路径 点击file---setting 每个…

IDEA配置本地Maven

IDEA配置Maven: 参考视频教程:https://www.bilibili.com/video/BV1Qf4y1T7Hx?p45 总体流程预览: 创建一个空的项目IDEA配置Maven环境Maven 坐标详解IDEA创建Maven项目IDEA导入Maven项目maven Helper插件依赖管理 1.创建一个空的项目 File—>New—>Project—>Empt…

idea配置tomcat

1.添加tomcat。 2.点击Edit Configurations后打开如下界面。| 3.点击加号 4.在这里配置tomcat信息, 5.填写好基本tomcat信息后,点击ok。我们就配置好了Tomcat,此时我们会看到。项目中显示了我们刚才配置的的Tomcat。 但是直接运行的话…

idea配置docker

IDEA作为开发电脑,要远程连接到另一台Linux电脑上部署的Docker服务,我们登陆到机器上,进行docker远程访问配置: IDEAdocker实践 - 邹姣姣 - 博客园 idea里 选择Plugins,插件 已经安装了docker插件 连接远程Docker服…

idea配置maven

idea配置maven 下载配置maven(如果有请跳过)打开idea开始配置maven附录: 下载配置maven(如果有请跳过) 首先你先得安装配置你本机maven的环境,官方下载maven,附带下载maven: 下载maven链接 我选择的时3.6.3-bin.zip&#xff0c…

Idea配置Tomcat服务器

一、新建项目 首先新建一个Java项目 此时只是新建了一个Java项目,还不能用于写JavaWeb程序,所以接下来需要添加Web框架,并 配置Tomact服务器 右键点击项目Demo1,选择【添加框架支持】,然后再左侧中选择【Web应用程序…

idea配置ant版本_idea配置ant项目

之前一直用的maven管理,所以编译 打包都交给了maven,但是最近接触了新的项目,不是用maven管理的,是ant去【管理】的(这么说不严谨),在用idea去本地启动tomcat的时候周折了一番,特记录。 1、找build.xml 里面…

IDEA配置jetty

🚌一个人可以走的很快,一群人可以走的很远📝 🎉点赞➕评论➕收藏 ➕关注 养成习惯(一键四连)📝 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝 &…

IDEA 配置热部署

IDEA 配置热部署 引言步骤1步骤2步骤3IDEA 旧版本IDEA 新版本 热部署的缺点总结 引言 平时如果我们修改了自己项目的代码后,都要重新运行启动类,才能使新的项目生效,配置了热部署后,我们就可以让 IDEA 自动帮我们重启项目了。 I…

IDEA配置TestNG

1.IDEA安装TestNG 若IDEA已经安装TestNG的插件,显示如下 若没有,则搜索TestNG,进行下载 2.创建单元测试方法 1.打开需要进行单元测试的方法,选择类名,点击AltEnter键,选择Create Test 第一次创建单元测…

Idea配置SVN

idea配置SVN 1. 配置svn.exe路径 2. 启用版本控制 VCS–enable version control integration 3. 设置Version Control Settings–Version Control 4. 在工程上右键可以看到 此时项目已经变更颜色了. 5. 提交maven工程到svn仓库 首先工程右键—subversion–share Directory…

IDEA配置GitHub

目录 1、IDEA配置 安装Git 配置GitHub账号 一、IDEA配置 安装Git File -> Setting -> Git ->Test 如果未安装Git,会提示安装 配置GitHub账号 配置账号,自动跳转到github上进行授权 二、代码管理 1、vcs配置,如下图 2、配置好…

IDEA配置JavaFX

从Java11开始,Java不再内置JavaFX。 此处使用Java17举例。创建好普通的Java项目以后需要进行如下配置 一,配置开发环境 1,进项目设置,添加JavaFx 2,将JavaFX的lib目录添加进来 二,配置运行参数 --module…