Skip to content
← 返回Redis列表
数据与原子性

Redis List(列表) · 1. 定位:解决什么问题至2. 命令速查与示例 ​

返回分篇目录

本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。

Redis List(列表) ​

本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。

1. 定位:解决什么问题 ​

List 是允许重复、保留顺序的字符串序列。适合最近聊天记录和两端队列;按分数排序用 ZSet,去重用 Set,需要事件游标、消费组与待确认记录时比较 Stream。

基本操作示例 ​

text
RPUSH learn:types:queue task-a task-b task-a
LPOP learn:types:queue
LRANGE learn:types:queue 0 1

预期弹出 task-a,剩余前两个元素为 task-b、task-a。弹出会移除元素,不能只靠这个流程就保证任务不会丢失;消费者取出后崩溃时,需要额外的确认和重试设计。避免把 List 当成任意位置都能常数时间访问的数组。

参考:List。

限长聊天记录 ​

LPUSH chat:room1 message 将新消息放在左侧,LTRIM chat:room1 0 199 保留最近 200 条。若要求每次写入后立刻满足长度上限,可用事务或 Lua 把两步合起来。

List 保存历史,Pub/Sub 负责在线推送,二者不能混为一谈。需要离线重放和消费进度时,可阅读 Stream。

2. 命令速查与示例 ​

按用途分组,共 22 项,覆盖 Redis 8.2.10 的本类型命令及子命令。点击命令名查看官方参数。示例在 redis-cli 中逐行输入,每次换例子前重置下面的教学数据。

准备与重置示例数据

在独立实验实例的 redis-cli 交互模式逐行输入,避免 shell 对引号、>、*、括号等符号进行解释。每个例子独立使用;换例子前重新执行下面的准备段,否则删除、弹出、过期和修改操作会影响后续结果。准备段仅重置列出的教学键,确认这些键不承载业务数据。

text
UNLINK learn:{list}:a learn:{list}:b
RPUSH learn:{list}:a a b c
RPUSH learn:{list}:b x y

示例的返回说明以刚完成准备段为前提,随机结果与剩余 TTL 不固定。带同一 {...} 的教学键便于在 Cluster 中满足相关多键操作的同槽要求。

两端写入与弹出 ​

命令与用途示例与结果复杂度
LPUSH
从左侧插入
LPUSH learn:{list}:a x y
依次向左插入,前两项为 y、x;返回新长度 5。
O(K)
RPUSH
从右侧插入
RPUSH learn:{list}:a d
右侧增加 d,返回 4。
O(K)
LPUSHX
仅已有列表左侧插入
LPUSHX learn:{list}:a x
键存在,返回新长度 4。
O(K)
RPUSHX
仅已有列表右侧插入
RPUSHX learn:{list}:a d
键存在,返回新长度 4。
O(K)
LPOP
左侧弹出
LPOP learn:{list}:a 2
返回并移除 a、b;COUNT 从 6.2 起支持。
O(M)
RPOP
右侧弹出
RPOP learn:{list}:a
返回并移除 c。
O(M)
LMPOP
从多个列表弹出
LMPOP 2 learn:{list}:a learn:{list}:b LEFT COUNT 2
从首个非空列表 a 返回 a、b。
O(K+M)

阻塞与跨列表移动 ​

命令与用途示例与结果复杂度
BLPOP
等待左侧弹出
BLPOP learn:{list}:a learn:{list}:b 1
准备数据非空时立即返回键名和 a;等待上限 1 秒。
O(K)
BRPOP
等待右侧弹出
BRPOP learn:{list}:a 1
返回键名和 c。
O(K)
BLMPOP
等待多列表批量弹出
BLMPOP 1 2 learn:{list}:a learn:{list}:b LEFT COUNT 2
最多等待 1 秒,从首个非空列表弹出两项。
O(K+M)
LMOVE
在两列表间原子移动
LMOVE learn:{list}:a learn:{list}:b RIGHT LEFT
返回 c,并将其移到 b 列表左侧。
O(1)
BLMOVE
等待原子移动
BLMOVE learn:{list}:a learn:{list}:b RIGHT LEFT 1
非空时立即移动 c;最多等待 1 秒。
O(1)

查询与列表修改 ​

命令与用途示例与结果复杂度
LLEN
列表长度
LLEN learn:{list}:a
返回 3。
O(1)
LINDEX
读取指定下标
LINDEX learn:{list}:a 1
返回 b,负下标从尾部计数。
最坏 O(N)
LRANGE
读取区间
LRANGE learn:{list}:a 0 1
返回 a、b,停止下标包含在内。
O(S+M)
LPOS
查找元素下标
LPOS learn:{list}:a b
返回 1;可用 RANK/COUNT/MAXLEN 限定查找。
平均 O(N)
LSET
替换指定下标
LSET learn:{list}:a 1 B
返回 OK,中间元素变成 B。
最坏 O(N)
LINSERT
在指定值前后插入
LINSERT learn:{list}:a BEFORE b x
插入后长度为 4。
O(S)
LREM
按值移除
LREM learn:{list}:a 1 b
从左向右最多移除一个 b,返回 1。
O(N+M)
LTRIM
只保留指定区间
LTRIM learn:{list}:a 0 1
返回 OK,仅保留 a、b。
O(R)

旧版兼容命令 ​

命令与用途示例与结果复杂度
RPOPLPUSH
旧式右出左入
RPOPLPUSH learn:{list}:a learn:{list}:b
返回 c;新代码用 LMOVE ... RIGHT LEFT。
O(1)
BRPOPLPUSH
旧式阻塞右出左入
BRPOPLPUSH learn:{list}:a learn:{list}:b 1
返回 c;新代码用 BLMOVE。
O(1)
版本与复杂度补充

下表保留每条命令的引入版本、兼容状态及复杂度符号含义;复杂度不包含全部网络传输、内存分配和等待成本。

命令引入版本与状态复杂度说明
LPUSH1.0.0O(K),K 为本次指定元素数。
RPUSH1.0.0O(K),K 为本次指定元素数。
LPUSHX2.2.0O(K),K 为本次指定元素数。
RPUSHX2.2.0O(K),K 为本次指定元素数。
LPOP1.0.0O(M),M 为返回元素数;单元素 O(1)。
RPOP1.0.0O(M),M 为返回元素数;单元素 O(1)。
LMPOP7.0.0O(K+M),K 为提供的键数,M 为返回元素数;阻塞等待时间另计。
BLPOP2.0.0O(K),K 为提供的键数;阻塞等待时间另计。
BRPOP2.0.0O(K),K 为提供的键数;阻塞等待时间另计。
BLMPOP7.0.0O(K+M),K 为提供的键数,M 为返回元素数;阻塞等待时间另计。
LMOVE6.2.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
BLMOVE6.2.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
LLEN1.0.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
LINDEX1.0.0最坏 O(N),N 为列表长度;首尾访问或替换可为 O(1)。
LRANGE1.0.0O(S+M),S 为定位起点的遍历距离,M 为返回元素数。
LPOS6.0.6平均 O(N),N 为列表长度;靠近两端匹配或指定 MAXLEN 可减少扫描量。
LSET1.0.0最坏 O(N),N 为列表长度;首尾访问或替换可为 O(1)。
LINSERT2.2.0O(S),S 为找到 pivot 前扫描的元素数。
LREM1.0.0O(N+M),N 为列表长度,M 为删除数。
LTRIM1.0.0O(R),R 为实际移除元素数。
RPOPLPUSH1.2.0;从 6.2.0 起弃用(兼容保留)O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
BRPOPLPUSH2.2.0;从 6.2.0 起弃用(兼容保留)O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。

通用键操作见键与过期时间,这里集中列出类型自身的命令。

继续阅读