首页/数据/数据库速查/LREM 按值删除(count 正负零的语义)
Redis 命令96 条

LREM 按值删除(count 正负零的语义)

按值删除元素:count>0 从左删 count 个,count<0 从右删,count=0 删除全部匹配;返回实际删除数量。

数据库速查数据更新于 2026-10-13

按值删除的三种语义

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) 级别的操作,在长列表上都不适合高频调用。

易错点

  • 参数顺序写反:正确写法是 LREM key count value,把值写在前面会被当作 count 解析并报错
  • 用 LREM 0 高频清理大列表:每次都要全量扫描,CPU 被悄悄吃掉,需要改成重建或换数据结构
  • 依赖 LREM 的返回值判断列表是否为空:返回 0 只代表没匹配到值,空列表也返回 0,应改用 LLEN
  • 在并发消费队列上按值删除:同值元素被误删或删错,队列类场景建议用带唯一标识的元素

数据来源与参考

  • Redis 官方文档: LREM

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌