按值删除的三种语义
LREM 按元素值删除列表中的成员,count 的正负决定删除方向与数量:正数表示从左往右删 count 个,负数表示从右往左删绝对值个,0 表示删除全部匹配值。命令返回实际删除的元素个数,因此可以判断值到底存不存在,列表被删空后键会自动消失。
基本信息
| 适用平台 | Redis 全版本 |
|---|---|
| 语法 | LREM key count value |
| 返回值 | 实际删除的元素个数 |
| 复杂度 | O(N),N 为列表长度(找到足够元素即停止) |
| 副作用 | 列表为空时键被自动删除 |
典型使用场景
- 任务队列中撤销某条待处理任务,按任务 ID 匹配删除
- 消息列表里移除被撤回的单条内容
- 按值清理重复写入的脏数据
- 优先删除最新一条记录(count 为 -1)
- 确认某个值是否在列表中:用返回的删除数量判断
示例与效果
示例与效果
RPUSH q a b a c a # 列表:a b a c a
LREM q 1 a # 返回 1,删最左边一个 a -> b a c a
LRANGE q 0 -1 # b a c a
LREM q -1 a # 返回 1,删最右边一个 a -> b a c
LREM q 0 a # 返回 1,删除全部剩余匹配值
LRANGE q 0 -1 # b c
EXISTS q # 1:列表仍非空
LREM q 0 b
LREM q 0 c # 列表被删空
EXISTS q # 0:键已自动删除count 取值语义
| count | 行为 | 典型用法 |
|---|---|---|
| 正数 n | 从左往右删除 n 个匹配值 | 删除最早的记录 |
| 负数 -n | 从右往左删除 n 个匹配值 | 删除最新的记录 |
| 0 | 删除全部匹配值 | 彻底清理某类值 |
| 不存在的值 | 不删除任何元素,返回 0 | 非破坏性地判断值是否存在 |
LREM 返回 0 只说明没有匹配到值,不能反推列表为空:判断长度请用 LLEN,判断键是否存在请用 EXISTS。
对长列表频繁执行 LREM key 0 value 会反复全量扫描,是典型的隐藏慢命令,清理大列表建议重建键或改用 Set 结构。
LREM 与 LPOS 的分工:只需要知道某个值在不在列表里、位置在哪,用 LPOS 更省事;确实要按值删除才用 LREM。两者都是 O(N) 级别的操作,在长列表上都不适合高频调用。