Redis的五种基础数据结构

article/2025/9/13 22:54:51

Redis的五种基础数据结构

Redis有5种基础数据结构,分别为:String(字符串),list(列表),hash(字典),set(集合)和zset(有序集合)。

1.String(字符串)

字符串的结构

字符串String是Redis最简单的数据结构,它的内部表示就是一个字符数组。redis中,所有的数据结构都以唯一的key字符串作为名称,然后通过这个唯一的key值来获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样。
Redis中的字符串是动态字符串,是可以修改的字符串,内部结构的实现类似于java中的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。内部为当前字符串分配的实际空间capacity一般要高于实际字符串长度len。当字符串长度小于1MB时,扩容都是加倍现有的空间。当字符串长度超过1MB时,扩容时,一次只会多扩1MB的空间。
在这里插入图片描述
注:Redis规定了字符串的长度不能超过512MB。

字符串基本操作

键值对
在这里插入图片描述
其他操作可参考菜鸟教程 https://www.runoob.com/redis/redis-tutorial.html
批量键值对
在这里插入图片描述
过期和set命令扩展
可以对 key 设置过期时间,到时间会被自动删除,这个功能常用来控制缓存的失效时间
在这里插入图片描述
计数
如果 value 是一个整数,还可以对它使用 INCR 命令进行 原子性 的自增操作,这意味着及时多个客户端对同一个 key 进行操作,也决不会导致竞争的情况
在这里插入图片描述

字符串的一些使用场景

1.计数器
string类型的incr和decr命令的作用是将key中储存的数字值加一/减一,这两个操作具有原子性,总能安全地进行加减操作,因此可以用string类型进行计数,如微博的评论数、点赞数、分享数,抖音作品的收藏数,京东商品的销售量、评价数等。
2.存储对象
利用JSON的字符串和对象之间的相互转换来实现
3.分布式锁(在后面的分布式锁章节再讲)

2.list(列表)

列表的结构

Redis 的列表相当于 Java 语言中的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。
Redis的列表结构常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串,塞进Redis的列表,另 个线程从这个列表中轮询数据进行处理。

列表基本操作

在这里插入图片描述
队列(右边进左边出)
队列是先进先出的数据结构,常用于消息排队和异步逻辑处理,它会确保元素的访问顺序性。
在这里插入图片描述
栈(右边进右边出)
栈是先进后出的数据结构,跟队列正好相反 Redis 的列表数据结构来做栈使用的业务场景并不多见。
在这里插入图片描述

列表的一些使用场景

1.消息队列:通过Lpush命令从左边插入数据,使用BRpop命令阻塞的“抢”列表尾部的数据。
2.文章列表或者数据分页展示的应用。

3.hash(字典)

字典的结构

Redis 中的字典相当于 Java 中的 HashMap,内部实现也差不多类似,都是通过 “数组 + 链表” 的链地址法来解决部分 哈希冲突,同时这样的结构也吸收了两种不同数据结构的优点。
渐进rehash策略:
Java HashMap在字典很大时 rehash 是个耗时的操作,需要一次性全部rehash,Redis为了追求性能,不能堵塞服务,所以采用渐进rehash策略。
渐进式 rehash 会在 rehash 的同时,保留新旧两个 hash 结构,如下图所示,查询时会同时查询两个 hash 结构,然后在后续的定时任务以及 hash 操作指令中,循序渐进的把旧字典的内容迁移到新字典中。当搬迁完成了,就会使用新的 hash 结构取而代之。
在这里插入图片描述
扩缩容的条件
正常情况下,当 hash 表中 元素的个数等于第一维数组的长度时,就会开始扩容,扩容的新数组是 原数组大小的 2 倍。不过如果 Redis 正在做 bgsave(持久化命令),为了减少内存也得过多分离,Redis 尽量不去扩容,但是如果 hash 表非常满了,达到了第一维数组长度的 5 倍了,这个时候就会 强制扩容。
当 hash 表因为元素逐渐被删除变得越来越稀疏时,Redis 会对 hash 表进行缩容来减少 hash 表的第一维数组空间占用。所用的条件是 元素个数低于数组长度的 10%,缩容不会考虑 Redis 是否在做 bgsave。

字典的基本操作

hash 也有缺点,hash 结构的存储消耗要高于单个字符串,所以到底该使用 hash 还是字符串,需要根据实际情况再三权衡。并且hash的使用场景也比较少。
在这里插入图片描述

字典的一些使用场景

1.购物车
2.存储对象

4.set(集合)

set(集合)的结构

Redis 的集合相当于 Java 语言中的 HashSet,它内部的键值对是无序、唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 NULL。
当集合中的最后一个元素被移除后,数据结构会被自动删除,内存被回收。

set(集合)基本操作

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615203417565.png在这里插入图片描述
这里可以看出不能重复,且无序。

set(集合)的一些使用场景

1.标签
比如我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。
2. 好友/关注/粉丝/感兴趣的人集合
3.随机展示

5.zset(有序集合)

zset(有序集合)的结构

zset 可能是 Redis 提供的最有特色的数据结构,如下图所示,它类似于 Java 的SortedSet 和HashMap的结合体, 一方面它是个 set ,保证了内部 value 的唯性,另方面它可以给每个 value 赋予一个 score ,代表这个 value 的排序权重。它的内部实现用的是一种叫作“跳跃列表”的数据结构。跳跃表比较复杂,这里就不讲解跳跃表内部结构原理了,后面有机会可以深入学习。
在这里插入图片描述

zset(有序集合)基本操作

在这里插入图片描述

zset(有序集合)的一些使用场景

1.排行榜

参考文章

1.《Redis 深度历险》 - https://book.douban.com/subject/30386804/
2. https://mp.weixin.qq.com/s/MT1tB2_7f5RuOxKhuEm1vQ


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

相关文章

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…

IDEA配置Gitee

文章目录 前言一、Git配置1.Git安装教程2.IDEA配置Git 二、Gitee配置1.安装Gitee插件2.注册Gitee账号3.配置Gitee相关账号信息4.进行代码绑定5.Gitee代码上传下载1.云端文件下载到本地2.本地文件上传云端 前言 本教程所需前提本地Git安装,以及Gitee账号注册 一、Gi…