当前位置: 首页 > backend >正文

【Redis】解码Redis中的list类型,基本命令,内部编码方式以及适用的场景

📚️前言

🌟🌟🌟精彩读导

本次我们将全面剖析Redis的核心技术要点,包括其丰富的数据类型体系、高效的编码方式以及秒级响应的性能奥秘。对于渴望深入理解Redis底层机制的技术爱好者,这是一次难得的学习机会!

🔍 推荐扩展阅读

想了解更多数据库技术干货?欢迎访问小编的CSDN技术博客: 👉GGBondlctrl-CSDN博客 👈 (持续更新分布式系统、中间件等深度技术文章)

💖 读者互动

您的每一个👍点赞、⭐收藏和✏️评论,都是我们持续输出优质技术内容的强大动力!期待在评论区看到您的见解

目录

📚️前言

📚️1.初识list

📚️2.命令

2.1lpush & rpush

 2.2lrange

2.3lpushx & rpushx

2.4lindex & linsert

2.5llen

2.6lrem & ltrim

2.7lset

2.8blpop & brpop

📚️3.内部编码 

3.1ziplist & linkedlist(旧版本)

3.2quicklist

📚️4.list类型应用场景

4.1存储信息

4.2作为消息队列

📚️5.总结


 

📚️1.初识list

 大致的结构就是如下所示:

注意:list内部的编码方式不是一个简单的数组,而是更接近于我们的双端队列(deque)

这里的list头部以及尾部都能高效的插入或者是删除元素,可以把这里的list当成双端队列来使用,其中的lpush,lpop就是list命令中的一部分

📚️2.命令

2.1lpush & rpush

作用:指定一个或者多个元素头插的方式插入list中,“l”就是left,“r”就是right,所以这里的意思就是左边插入元素还是右边插入元素:

lpush key element1 element2 ....

具体的演示如下所示:

可以发现,左插入就是头插法,右边插入就是尾插法;并且这里的lrange的作用就是获取list的指定范围的元素

 2.2lrange

作用:查看指定范围的元素

lrange key start stop

注意:这里的start就是开始位置,end就是结束位置,当然这里的end也是可以支持负数的

具体的演示如下所示: 

当我们的下标不合法时,就会返回一个空的数组~~~

2.3lpushx & rpushx

作用:当key存在时,进行一个或者多个的头插,这里可以理解为列表的更新

lpushx key element element2

演示如下:

 可以看到,在key不存在的情况下,这里的插入操作就是失效的~~~,就理解为更新操作即可

2.4lindex & linsert

作用:

lindex根据给定的下标,来获取我们对应下标的元素,若下标不合法,那么返回就是nil

linsert给定列表的基准下标,在下标之前还是之后进行指定元素的插入操作

命令:

lindex key index
linsert key <before | after> pivot element

具体的演示如下:

可以看到在插入操作的时候,我们这里的返回值就是插入成功之后的长度~~~

2.5llen

作用:获取列表的长度

llen key

小编这里就不演示了,比较简单这个命令

2.6lrem & ltrim

作用:

lrem:指定删除列表中某个元素的值,并指定删除的个数

ltrim:指定保存的范围,范围外面的进行删除(闭区间)

命令:

lrem key count element
ltrim key start stop

具体的演示如下:

当我们的count为正数的时候:

当我们的count为负数的时候:

当我们的count为0的时候:

总结:

count > 0 : 从左往右 删除对应个数

count < 0 : 从右往左 删除对应个数

count = 0 :删除全部指定元素

2.7lset

作用:根据下标来修改元素,范围不合法会提示越界异常

lset key index element

 演示如下:

设置成功返回“OK”

2.8blpop & brpop

作用:

多了阻塞的功能如果list中没有数据,就会产生阻塞,直到存在数据

使用brpop blpop这里是可以显示设置我们的阻塞时间(不一定是无休止的等待)

注意:命令中设置了多个键,那么会从左到右进行遍历,一旦有一个键对应的列表可以弹出元素,命令立即返回

注意:如果多个客户端同时多一键键执行pop,那么先执行命令的客户端会得到弹出元素

命令:

blpop key [key] timeout

小编这里演示一下吧:

这里我们打开两个redis客户端,然后一个客户端进行阻塞出弹出功能:

接下来我们立即在另一个客户端下执行列表的插入操作,那么右边客户端就可以获取弹出这个元素:

注意:我们返回的结果就是一个二元组,一方面是告诉我们的当前的数据是来自那个key,一方面是告诉我们取得的数据是啥

当然我们可以针对多个key进行操作,即那个列表先插入,那个列表的值就先弹出

📚️3.内部编码 

3.1ziplist & linkedlist(旧版本)

小编在之前的就已经讲解过了,关于ziplist的操作

ziplist:把数据按照更紧凑的压缩形式进行表示的,节省空间,但是元素个数多了,操作的效率会越来越低(涉及到计算获取位置,解压缩操作消耗时间)

linkedlist:当列表类型无法满足ziplist的条件时,redis会使用linkedList作为列表内部的实现,优点就是快速,但是不节省空间

执行如下命令:

然后我们可以发现:

list-max-listpack-size -2​​​​

作用​​:控制列表(List)类型内部使用 listpack 的最大容量(listpack 是 Redis 7.0 后取代 ziplist 的新结构)。
​​取值含义​​:-2:表示每个 listpack 节点​​最大为 4 KB​​(默认值)。

正整数(如 4096):表示每个 listpack 节点最大为 ​​指定字节数​​(单位为字节)。
​​动态转化逻辑​​:
当列表元素增多时,Redis 会将列表拆分为多个 listpack 节点组成的 quicklist(双向链表)。若单个 listpack 节点大小超过此阈值,会自动分裂为两个节点。

所以这是旧版本的哦~~~

3.2quicklist

quicklist:是链表和压缩列表的结合,整体还是一个链表,链表的节点就是一个压缩列表;

每个压缩列表都不会太大(存储一部分元素)同时把多个压缩列表通过链式结构连接起来

所以它综合了ziplist以及linkedList的优点;

这里我们可以使用:

object encoding key

来查看我们列表的内部编码,小编就不再进行演示~~~

📚️4.list类型应用场景

4.1存储信息

假如,有一张mysql的表:

那么我们redis的构造就是如下:

这表名,我们的redis虽然很快,但是在表的建立,以及一些简单的条件筛选上不如mysql

4.2作为消息队列

由于我们的brpop以及blpop都有阻塞的功能,那么就可以实现简单的消息队列的操作;

谁先执行这个brpop,这就能拿到这个新来的元素

假设消费者执行顺序是1 2 3,

当新元素到达之后,首先是消费者1拿到元素,然后

从brpop中返回,此时消费者1还想获取就得重新执行brpop

此时再来一个新的元素过来,就是消费者2进行获取

.............(达到了轮询效果)

多频道阻塞队列

多频道,在某种数据发生问题的时候,可以缩小bug出现范围并且不会对其他数据造成影响~~~

📚️5.总结

本文系统讲解了Redis中List数据类型的关键知识点:

  1. 数据结构:采用双端队列结构,支持高效的头尾操作
  2. 核心命令:详细解析lpush/rpush、lrange、blpop等18个常用命令及使用场景
  3. 编码演进:从ziplist+linkedlist到7.0版本优化的quicklist实现
  4. 典型应用:包括关系型数据缓存、多消费者消息队列等实战场景
  5. 性能优化:通过listpack配置参数调整存储效率

通过具体命令演示和内部机制分析,帮助开发者深入掌握Redis List的高效使用技巧。

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

       😊😊  期待你的关注~~

http://www.xdnf.cn/news/14731.html

相关文章:

  • 流程管理系统技术选型避坑指南(含开源)
  • 优化 ArcPy 脚本性能
  • Jmeter并发测试和持续性压测
  • AI+实时计算如何赋能金融系统?DolphinDB 在国泰君安期货年度中期策略会的演讲
  • 鸿蒙版FlutterSDK3.27.4可以使用了
  • 报道称CoreWeave洽谈收购Core Scientific,后者涨超30%
  • 人工智能-基础篇-2-什么是机器学习?(ML,监督学习,半监督学习,零监督学习,强化学习,深度学习,机器学习步骤等)
  • 报表控件stimulsoft教程:在报表、仪表板和 PDF 表单自动生成缩略图
  • 华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)
  • 【缓存技术】深入分析如果使用好缓存及注意事项
  • C++(模板与容器)
  • python中学物理实验模拟:斜面受力分析
  • 苍穹外卖day3--公共字段填充+新增菜品
  • python基于协同过滤的动漫推荐系统
  • 【51单片机5毫秒定时器】2022-6-1
  • Linux 内核 TCP 的核心引擎:tcp_input.c 与 tcp_output.c 的协同之道
  • Miniconda+Jupyter+PyCharm初始环境配置
  • 物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践
  • 【已解决】Android Studio gradle遇到unresolved reference错误
  • 【机器学习深度学习】线性回归
  • 【thinkphp5】Session和Cache记录微信accesstoken
  • 【原创】【4】【辅助工具】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
  • Gartner《敏捷化组织团队拓扑方法论》学习心得
  • [特殊字符]推客带货小程序解决方案——0门槛裂变营销,佣金赚不停!
  • 华为交换机 USG6311E 新建 vlan
  • 海澜之家旗下斯搏兹选择百胜软件,E3+企业中台持续为运动品牌业务发展赋能
  • Node.js特训专栏-实战进阶:9.MySQL连接池配置与优化
  • Java全栈面试实录:从电商平台到AIGC,技术栈深度解析
  • 领域驱动设计(DDD)【13】之重构中的坏味道:深入理解依恋特性(Feature Envy)与表意接口模式
  • 八股文——JAVA基础:基本数据类型与包装类的区别