首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Redis 系列】常用数据结构---List类型

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

作者头像
optimistic_chen
发布2026-01-15 12:44:35
发布2026-01-15 12:44:35
910
举报

🚀 欢迎来到我的CSDN博客: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 中

代码语言:javascript
复制
lpush key element [element...]

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

代码语言:javascript
复制
rpush key element [element...]
在这里插入图片描述
在这里插入图片描述

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

LPUSHX 和 RPUSHX(增)

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

代码语言:javascript
复制
LPUSHX key element [element ...]

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

代码语言:javascript
复制
RPUSHX key element [element ...]
在这里插入图片描述
在这里插入图片描述

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

LRANGE(查)

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

代码语言:javascript
复制
LRANGE key start end
在这里插入图片描述
在这里插入图片描述

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

LPOP 和 RPOP(删)

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

代码语言:javascript
复制
LPOP key

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

代码语言:javascript
复制
RPOP key
在这里插入图片描述
在这里插入图片描述

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

LINDEX(查)

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

代码语言:javascript
复制
LINDEX key index
在这里插入图片描述
在这里插入图片描述

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

LINSERT(增)

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

代码语言:javascript
复制
LINSERT key <before | after> pivot element
在这里插入图片描述
在这里插入图片描述

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

LLEN

作用:获取list长度

代码语言:javascript
复制
LLEN key
在这里插入图片描述
在这里插入图片描述

返回值:list的⻓度

阻塞版本命令

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

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

blpop 和 lpop

代码语言:javascript
复制
#命令语法
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-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 📌 收藏本文,下次需要时不迷路!

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


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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • List列表
  • 常用命令
    • LPUSH 和 RPUSH(增)
    • LPUSHX 和 RPUSHX(增)
    • LRANGE(查)
    • LPOP 和 RPOP(删)
    • LINDEX(查)
    • LINSERT(增)
    • LLEN
  • 阻塞版本命令
    • blpop 和 lpop
  • 内部编码
    • listpack(redis 7.0+)
  • 应用场景
    • 消息队列
  • 完结撒花!🎉
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档