详解redis(7):数据结构List

一、List 是什么?

Redis List 的本质

有序的字符串序列,按插入顺序排列,两端操作快

你可以把它理解成:

双端队列

支持:

左边进 / 左边出

右边进 / 右边出

二、Redis 早期 List 的两种底层结构

Redis 的哲学:小数据用紧凑结构,大数据用通用结构

压缩列表

是什么?

一整块连续内存的紧凑结构

特点

内存占用极小

cache 友好

插入/删除需要移动内存

结构复杂(连锁更新问题)

双向链表

触发条件

元素数量多

或元素变大

node ⇄ node ⇄ node ⇄ node

特点

插入删除 O(1)

每个节点额外指针,内存浪费大

cache 命中率低

结构 问题
ziplist 修改代价大
linkedlist 内存碎片多
共存 代码复杂

三、Redis 3.2 之后的终极方案:QuickList

quicklist = 链表 + 压缩列表

quicklist 长什么样?

quicklist

┌────────┐ ┌────────┐ ┌────────┐

│ ziplist│ ⇄ │ ziplist│ ⇄ │ ziplist│

└────────┘ └────────┘ └────────┘

外层:双向链表

每个节点:一个 ziplist

quicklist 为什么比老方案好?

内存友好

一个 ziplist 里放多个元素

指针数量大幅减少

插入删除更快

一般只改某一个 ziplist

不用移动整个大 ziplist

cache 友好

ziplist 是连续内存

访问局部性强

操作复杂度

操作 时间复杂度
LPUSH / RPUSH O(1)
LPOP / RPOP O(1)
LINDEX O(n)
LRANGE O(n)

四、什么时候该用 List?

适合

消息队列(简单版)

时间线

任务队列

栈 / 队列

不适合

频繁随机访问

需要按 value 查找

五、消息队列到底要满足什么?

一个合格的消息队列(MQ),至少要满足这 3 点:

能力 含义
消息保序 消息按发送顺序被消费
去重能力 同一条消息不会被重复处理
消息可靠性 消息不会"丢"

List 如何实现"消息保序"?(FIFO)

List 天然有序

Redis List 的特点:

有序

按插入顺序排列

两端操作快

所以它天然适合 FIFO 队列

为什么是 LPUSH + RPOP?

生产者:LPUSH ←←←
List
消费者: →→→ RPOP

List 消费的第一个问题:CPU 空转

解决方案:BRPOP(阻塞式)

BRPOP 的行为

如果队列 为空

客户端阻塞(挂起)

一旦有新消息

立刻返回

不是忙等,是内核级等待

极大降低 CPU 消耗

非常适合 MQ 场景

相关推荐
一嘴一个橘子4 分钟前
redis.windows.conf 的 保护模式
redis
Leon-Ning Liu34 分钟前
【真实经验分享】OGG抽取进程报错 ORA-07445 [kgherrordmp()+986] ORA-00600 [17114]分析步骤
运维·数据库
CCPC不拿奖不改名38 分钟前
Redis 工程化部署深度解析
linux·服务器·数据库·redis·深度学习·缓存·rag
吴声子夜歌1 小时前
SQL进阶——自连接
数据库·sql
云贝教育-郑老师1 小时前
TDSQL(MySQL版)分布式事务实现机制深度解析:从两阶段提交到全局一致性读
数据库·sql
gb448oww51 小时前
Redis分布式锁进阶第三十五篇
数据库·redis·分布式
Full Stack Developme2 小时前
正则表达式设计及工作原理
数据库·mysql·正则表达式
云飞云共享云桌面2 小时前
搭建10人SolidWorks云设计环境:云飞云在非标自动化工厂的实测方案
运维·服务器·网络·数据库·自动化·电脑
A-刘晨阳2 小时前
关键基础设施安全底座:自主可控时序大模型TimechoAI的国产化实践与深度时序分析能力
大数据·数据库·安全·时序数据库
深盾科技_Virbox2 小时前
Virbox Protector 从何而来:深盾科技的软件保护演进
运维·数据库·科技