【Redis 系列】常用数据结构---List类型

2025博客之星年度评选已开启 10w+人浏览 3.5k人参与


🚀 欢迎来到我的优快云博客:Optimistic _ chen
一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏内容特色适合人群
🔥C语言从入门到精通系统讲解基础语法、指针、内存管理、项目实战零基础新手、考研党、复习
🔥Java基础语法系统解释了基础语法、类与对象、继承Java初学者
🔥Java核心技术面向对象、集合框架、多线程、网络编程、新特性解析有一定语法基础的开发者
🔥Java EE 进阶实战Servlet、JSP、SpringBoot、MyBatis、项目案例拆解想快速入门Java Web开发的同学
🔥Java数据结构与算法图解数据结构、LeetCode刷题解析、大厂面试算法题面试备战、算法爱好者、计算机专业学生

🚀我的承诺:
✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

List列表

List相当于数组或者顺序表,列表类型是用来存储多个有序字符串。其中每个字符串被称为元素,一个列表最多可以存储2^32-1个元素。
在redis中,列表基于双向链表实现,所以充当栈和队列的角色,在很多场景中都能得到应用。
在这里插入图片描述

特点:

  • 有序性:列表中元素是有序的,所以我们可以通过下标获取元素;通过下标添加或者删除元素
  • 可重复性:列表中元素允许重复。
  • 高性能操作:头、尾部操作时间复杂度为O(1),只有对列表中间进行操作时为O(N)(需要遍历)

常用命令

LPUSH 和 RPUSH(增)

LPUSH(头插)作用:将一个或者多个元素从左侧插入到 list 中

lpush key element [element...]

RPUSH(尾插)作用:将一个或者多个元素从右侧插入到 list 中

rpush key element [element...]

在这里插入图片描述
时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数
返回值:返回插入后list的长度

LPUSHX 和 RPUSHX(增)

LPUSHX 作用:在key存在时,将⼀个或者多个元素从左侧放⼊到list中。不存在,返回0

LPUSHX key element [element ...]

RPUSHX 作用:在key存在时,将⼀个或者多个元素从右侧放⼊到list中。不存在,返回0

RPUSHX key element [element ...]

在这里插入图片描述

时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数
返回值:返回插入后list的长度,不存在返回0

LRANGE(查)

作用:获取从start到end区间的所有元素,左闭右闭

LRANGE key start end

在这里插入图片描述

时间复杂度:O(N)
返回值:指定区域元素

LPOP 和 RPOP(删)

LPOP(头删):从list 左侧取出元素(注意:不是删除元素,是从列表取出元素)

LPOP key

RPOP(尾删):从list 右侧取出元素(注意:不是删除元素,是从列表取出元素)

RPOP key

在这里插入图片描述

返回值:取出的元素或者nil。

LINDEX(查)

作用:获取从左数第index位置的元素

LINDEX key index

在这里插入图片描述

时间复杂度:O(N)
返回值:取出的元素或者nil。

LINSERT(增)

作用:在特定位置插入元素

LINSERT key <before | after> pivot element

在这里插入图片描述

时间复杂度:O(N)
返回值:插⼊后的list⻓度

LLEN

作用:获取list长度

LLEN key

在这里插入图片描述

返回值:list的⻓度

阻塞版本命令

阻塞版本命令和非阻塞版本命令作用基本一致:

  • 在列表中有元素的情况下,阻塞版本和非阻塞版本表现一致。
    如果列表中没有元素,非阻塞版本会立即返回nil;但阻塞版本会根据timeout,阻塞等待一段时间,在等待期间redis会执行其他命令,但是发出阻塞命令的客户端表现为阻塞状态。
  • 命令中如果有多个键,那么从左向右遍历键,一旦有一个键对应的列表有元素,命令立即返回
  • 如果多个客户端同时对同一个键执行pop,那么最先执行命令的客户端得到弹出元素。

blpop 和 lpop

#命令语法
BLPOP key[key ...] timeout 
  • 当列表不为空时

lpop user:1:messages ➡ 立即得到元素 x,
blpop user:1:messages ➡ 立即得到元素 x
两者表现完全一致

在这里插入图片描述

  • 当列表为空时 (timeout=5s)

lpop user:1:messages ➡ 立即返回nil;
blpop user:1:messages ➡ 执行命令5s后,返回nil
两者表现不一致。
在这里插入图片描述

  • 当列表为空时(timeout=5s),有新元素加入

lpop user:1:messages ➡ 立即返回 nil;
blpop user:1:messages ➡ 等待5s期间如果有新元素加入,返回新元素。
两者表现不一致
在这里插入图片描述

特点LPOPBLPOP
阻塞行为非阻塞阻塞
空列表响应立即返回nil等待超时后返回nil
等待期间处理不等待可接收等待期间新元素
使用场景直接弹出需要等待数据的消费者场景

内部编码

列表的内部编码只有一种:quicklist(linkedlist+ziplist)

Redis 7.0 对 List 数据类型的内部实现进行了重大重构,主要是为了解决内存碎片问题,7.0之前的版本list内部编码使用ziplist(压缩列表)适用于小列表,根据 list-max-ziplist-sizelist-max-ziplist-entries 控制内部编码的转化。使用listpack将使内存更加紧凑。

listpack(redis 7.0+)

listpack使用新增配置项:

  • list-max-listpack-size(默认值,每个listpack最大8KB)
  • list-max-listpack-entries(控制 quicklist 中每个 listpack 节点最多能包含的元素数量)
    在这里插入图片描述

quicklist需要的数据太大,这里不好测试,感兴趣的可以自己在redis上测试一下8K的数据(或者使用Lua脚本)。

应用场景

消息队列

Redis可以使⽤lpush+brpop命令组合实现经典的阻塞式⽣产者-消费者模型队列。
在这里插入图片描述
上图清晰展示了生产者-消费者模式的工作流程:
生产者客户端通过LPUSH命令从列表左侧插入元素,而多个消费者客户端则使用BRPOP命令以阻塞方式竞争获取队首元素。
这种多消费者架构确保了消息处理的负载均衡和高可用性。

选择列表类型时总结的参考:
同侧存取:(lpush+lpop或者rpush+rpop)为栈
异侧存取:(lpush+rpop或者rpush+lpop)为队列

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen
📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中……


悄悄说:点击主页有更多精彩内容哦~ 😊

在这里插入图片描述

评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Optimistic _ chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值