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

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

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-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

📌 收藏本文,下次需要时不迷路!

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


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

相关推荐
扑火的小飞蛾2 分钟前
【macOS】n8n 安装配置笔记
笔记·macos
水天需0103 分钟前
HISTCONTROL 介绍
linux
hssfscv5 分钟前
Javaweb学习笔记——JDBC和Mybatis
笔记·学习·mybatis
羊小猪~~9 分钟前
数据库学习笔记(十八)--事务
数据库·笔记·后端·sql·学习·mysql
橘颂TA19 分钟前
【剑斩OFFER】哈希表简介
数据结构·算法·散列表
零度@19 分钟前
Java-Redis 缓存「从入门到黑科技」2026 版
java·redis·缓存
小尧嵌入式20 分钟前
c++红黑树及B树B+树
开发语言·数据结构·c++·windows·b树·算法·排序算法
optimistic_chen21 分钟前
【Redis 系列】常用数据结构---ZSET类型
数据结构·数据库·redis·xshell·zset·redis命令
tobias.b25 分钟前
408真题解析-2009-10-数据结构-排序
数据结构·算法·排序算法·408考研·408真题·真题解析
DemonAvenger30 分钟前
Redis与微服务:分布式系统中的缓存设计模式
数据库·redis·性能优化