Redis List(列表) · 1. 定位:解决什么问题至2. 命令速查与示例
本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。
Redis List(列表)
本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。
1. 定位:解决什么问题
List 是允许重复、保留顺序的字符串序列。适合最近聊天记录和两端队列;按分数排序用 ZSet,去重用 Set,需要事件游标、消费组与待确认记录时比较 Stream。
基本操作示例
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 对引号、>、*、括号等符号进行解释。每个例子独立使用;换例子前重新执行下面的准备段,否则删除、弹出、过期和修改操作会影响后续结果。准备段仅重置列出的教学键,确认这些键不承载业务数据。
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) |
版本与复杂度补充
下表保留每条命令的引入版本、兼容状态及复杂度符号含义;复杂度不包含全部网络传输、内存分配和等待成本。
| 命令 | 引入版本与状态 | 复杂度说明 |
|---|---|---|
| LPUSH | 1.0.0 | O(K),K 为本次指定元素数。 |
| RPUSH | 1.0.0 | O(K),K 为本次指定元素数。 |
| LPUSHX | 2.2.0 | O(K),K 为本次指定元素数。 |
| RPUSHX | 2.2.0 | O(K),K 为本次指定元素数。 |
| LPOP | 1.0.0 | O(M),M 为返回元素数;单元素 O(1)。 |
| RPOP | 1.0.0 | O(M),M 为返回元素数;单元素 O(1)。 |
| LMPOP | 7.0.0 | O(K+M),K 为提供的键数,M 为返回元素数;阻塞等待时间另计。 |
| BLPOP | 2.0.0 | O(K),K 为提供的键数;阻塞等待时间另计。 |
| BRPOP | 2.0.0 | O(K),K 为提供的键数;阻塞等待时间另计。 |
| BLMPOP | 7.0.0 | O(K+M),K 为提供的键数,M 为返回元素数;阻塞等待时间另计。 |
| LMOVE | 6.2.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| BLMOVE | 6.2.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| LLEN | 1.0.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| LINDEX | 1.0.0 | 最坏 O(N),N 为列表长度;首尾访问或替换可为 O(1)。 |
| LRANGE | 1.0.0 | O(S+M),S 为定位起点的遍历距离,M 为返回元素数。 |
| LPOS | 6.0.6 | 平均 O(N),N 为列表长度;靠近两端匹配或指定 MAXLEN 可减少扫描量。 |
| LSET | 1.0.0 | 最坏 O(N),N 为列表长度;首尾访问或替换可为 O(1)。 |
| LINSERT | 2.2.0 | O(S),S 为找到 pivot 前扫描的元素数。 |
| LREM | 1.0.0 | O(N+M),N 为列表长度,M 为删除数。 |
| LTRIM | 1.0.0 | O(R),R 为实际移除元素数。 |
| RPOPLPUSH | 1.2.0;从 6.2.0 起弃用(兼容保留) | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| BRPOPLPUSH | 2.2.0;从 6.2.0 起弃用(兼容保留) | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
通用键操作见键与过期时间,这里集中列出类型自身的命令。
继续阅读
- 数据与原子性
- 数据与原子性
- 完整实践