
🚀 欢迎来到我的CSDN博客:Optimistic _ chen
✨ 一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!
🚀我的专栏推荐:
| 专栏 | 内容特色 | 适合人群 |
|---|---|---|
| 🔥C语言从入门到精通 | 系统讲解基础语法、指针、内存管理、项目实战 | 零基础新手、考研党、复习 |
| 🔥Java基础语法 | 系统解释了基础语法、类与对象、继承 | Java初学者 |
| 🔥Java核心技术 | 面向对象、集合框架、多线程、网络编程、新特性解析 | 有一定语法基础的开发者 |
| 🔥Java EE 进阶实战 | Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 | 想快速入门Java Web开发的同学 |
| 🔥Java数据结构与算法 | 图解数据结构、LeetCode刷题解析、大厂面试算法题 | 面试备战、算法爱好者、计算机专业学生 |
🚀我的承诺:
✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例
✅ 持续更新:专栏内容定期更新,紧跟技术趋势
✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)
🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨
📌 标签:#技术博客 #编程学习 #Java #C语言 #算法 #程序员
文章目录
- List列表
- 常用命令
-
- [LPUSH 和 RPUSH(增)](#LPUSH 和 RPUSH(增))
- [LPUSHX 和 RPUSHX(增)](#LPUSHX 和 RPUSHX(增))
- LRANGE(查)
- [LPOP 和 RPOP(删)](#LPOP 和 RPOP(删))
- LINDEX(查)
- LINSERT(增)
- LLEN
- 阻塞版本命令
-
- [blpop 和 lpop](#blpop 和 lpop)
- 内部编码
-
- [listpack(redis 7.0+)](#listpack(redis 7.0+))
- 应用场景
- 完结撒花!🎉
List列表
List相当于数组或者顺序表,列表类型是用来存储多个有序字符串 。其中每个字符串被称为元素,一个列表最多可以存储2^32-1个元素。
在redis中,列表基于双向链表实现 ,所以充当栈和队列的角色,在很多场景中都能得到应用。

特点:
- 有序性:列表中元素是有序的,所以我们可以通过下标获取元素;通过下标添加或者删除元素
- 可重复性:列表中元素允许重复。
- 高性能操作:头、尾部操作时间复杂度为O(1),只有对列表中间进行操作时为O(N)(需要遍历)
常用命令
LPUSH 和 RPUSH(增)
LPUSH(头插)作用:将一个或者多个元素从左侧插入到 list 中
powershell
lpush key element [element...]
RPUSH(尾插)作用:将一个或者多个元素从右侧插入到 list 中
powershell
rpush key element [element...]

时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数
返回值:返回插入后list的长度
LPUSHX 和 RPUSHX(增)
LPUSHX 作用:在key存在时,将⼀个或者多个元素从左侧放⼊到list中。不存在,返回0
powershell
LPUSHX key element [element ...]
RPUSHX 作用:在key存在时,将⼀个或者多个元素从右侧放⼊到list中。不存在,返回0
powershell
RPUSHX key element [element ...]

时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数
返回值:返回插入后list的长度,不存在返回0
LRANGE(查)
作用:获取从start到end区间的所有元素,左闭右闭
powershell
LRANGE key start end

时间复杂度:O(N)
返回值:指定区域元素
LPOP 和 RPOP(删)
LPOP(头删):从list 左侧取出元素(注意:不是删除元素,是从列表取出元素)
powershell
LPOP key
RPOP(尾删):从list 右侧取出元素(注意:不是删除元素,是从列表取出元素)
powershell
RPOP key

返回值:取出的元素或者nil。
LINDEX(查)
作用:获取从左数第index位置的元素
powershell
LINDEX key index

时间复杂度:O(N)
返回值:取出的元素或者nil。
LINSERT(增)
作用:在特定位置插入元素
powershell
LINSERT key <before | after> pivot element

时间复杂度:O(N)
返回值:插⼊后的list⻓度
LLEN
作用:获取list长度
powershell
LLEN key

返回值:list的⻓度
阻塞版本命令
阻塞版本命令和非阻塞版本命令作用基本一致:
- 在列表中有元素的情况下,阻塞版本和非阻塞版本表现一致。
如果列表中没有元素,非阻塞版本会立即返回nil;但阻塞版本会根据timeout,阻塞等待一段时间,在等待期间redis会执行其他命令,但是发出阻塞命令的客户端表现为阻塞状态。 - 命令中如果有多个键,那么从左向右遍历键,一旦有一个键对应的列表有元素,命令立即返回。
- 如果多个客户端同时对同一个键执行pop,那么最先执行命令的客户端得到弹出元素。
blpop 和 lpop
powershell
#命令语法
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期间如果有新元素加入,返回新元素。
两者表现不一致

| 特点 | LPOP | BLPOP |
|---|---|---|
| 阻塞行为 | 非阻塞 | 阻塞 |
| 空列表响应 | 立即返回nil | 等待超时后返回nil |
| 等待期间处理 | 不等待 | 可接收等待期间新元素 |
| 使用场景 | 直接弹出 | 需要等待数据的消费者场景 |
内部编码
列表的内部编码只有一种:quicklist(linkedlist+ziplist)
Redis 7.0 对 List 数据类型的内部实现进行了重大重构,主要是为了解决内存碎片问题,7.0之前的版本list内部编码使用ziplist(压缩列表)适用于小列表,根据 list-max-ziplist-size 和 list-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
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中......
悄悄说:点击主页有更多精彩内容哦~ 😊
