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

特点:
LPUSH(头插)作用:将一个或者多个元素从左侧插入到 list 中
lpush key element [element...]RPUSH(尾插)作用:将一个或者多个元素从右侧插入到 list 中
rpush key element [element...]
时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数 返回值:返回插入后list的长度
LPUSHX 作用:在key存在时,将⼀个或者多个元素从左侧放⼊到list中。不存在,返回0
LPUSHX key element [element ...]RPUSHX 作用:在key存在时,将⼀个或者多个元素从右侧放⼊到list中。不存在,返回0
RPUSHX key element [element ...]
时间复杂度:只插⼊⼀个元素为O(1),插⼊多个元素为O(N),N为插⼊元素个数 返回值:返回插入后list的长度,不存在返回0
作用:获取从start到end区间的所有元素,左闭右闭
LRANGE key start end
时间复杂度:O(N) 返回值:指定区域元素
LPOP(头删):从list 左侧取出元素(注意:不是删除元素,是从列表取出元素)
LPOP keyRPOP(尾删):从list 右侧取出元素(注意:不是删除元素,是从列表取出元素)
RPOP key
返回值:取出的元素或者nil。
作用:获取从左数第index位置的元素
LINDEX key index
时间复杂度:O(N) 返回值:取出的元素或者nil。
作用:在特定位置插入元素
LINSERT key <before | after> pivot element
时间复杂度:O(N) 返回值:插⼊后的list⻓度
作用:获取list长度
LLEN key
返回值:list的⻓度
阻塞版本命令和非阻塞版本命令作用基本一致:
#命令语法
BLPOP key[key ...] timeout lpop user:1:messages ➡ 立即得到元素 x, blpop user:1:messages ➡ 立即得到元素 x 两者表现完全一致

lpop user:1:messages ➡ 立即返回nil; blpop user:1:messages ➡ 执行命令5s后,返回nil 两者表现不一致。

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使用新增配置项:

quicklist需要的数据太大,这里不好测试,感兴趣的可以自己在redis上测试一下8K的数据(或者使用Lua脚本)。
Redis可以使⽤lpush+brpop命令组合实现经典的阻塞式⽣产者-消费者模型队列。

上图清晰展示了生产者-消费者模式的工作流程: 生产者客户端通过LPUSH命令从列表左侧插入元素,而多个消费者客户端则使用BRPOP命令以阻塞方式竞争获取队首元素。 这种多消费者架构确保了消息处理的负载均衡和高可用性。
选择列表类型时总结的参考: 同侧存取:(lpush+lpop或者rpush+rpop)为栈 异侧存取:(lpush+rpop或者rpush+lpop)为队列

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍 你的鼓励是我创作的最大动力~
✨ 想获取更多干货? 欢迎关注我的专栏 → optimistic_chen 📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中……
悄悄说:点击主页有更多精彩内容哦~ 😊