首页/数据/数据库速查/LPOP / RPOP 弹出与 count 参数
Redis 命令96 条

LPOP / RPOP 弹出与 count 参数

从两端弹出并删除元素;Redis 6.2 起支持 count 一次弹多个,键被弹空后自动删除。

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

LPOP / RPOP 是什么

两者从列表两端弹出元素并把它从列表里删除:LPOP 取左端、RPOP 取右端,返回被弹出的值,键不存在时返回 nil。Redis 6.2 起支持 count 参数一次弹多个,返回数组。列表被弹空后键会被自动删除,所以随后 EXISTS 返回 0 属于正常现象,不是数据异常。

基本信息

适用版本LPOP / RPOP 全版本;count 参数需 6.2+
语法LPOP key [count] / RPOP key [count]
返回值单元素;带 count 时为数组;键不存在返回 nil
副作用列表为空时键被自动删除
相关命令LMOVE / BLPOP / LLEN / LRANGE

典型使用场景

  • 队列消费:RPUSH 入队、LPOP 出队即 FIFO
  • 批量消费:按 count 一次弹多个,成批落库减少往返
  • 栈式回退:LPUSH 与 LPOP 组合实现后进先出
  • 任务重试:处理失败把元素重新推回队列,用 LMOVE 保证不丢
  • 简单轮询:LPOP 取不到就短暂等待,替代长时间阻塞的 BLPOP
  • 积压观测:结合 LLEN 判断队列长度,做消费滞后告警

示例

示例
RPUSH q a b c d
LPOP q        # a(弹出并删除)
RPOP q        # d
LPOP q 2      # 返回数组:1) b  2) c(一次弹两个,需 6.2+)
EXISTS q      # 0:弹空后键自动删除
LPOP q        # nil:键不存在,注意与空字符串区分
LMOVE q processing LEFT RIGHT   # 移到处理中列表,处理完再删,避免丢任务

命令对照

命令取值端返回形式
LPOP key左端单个元素或 nil
RPOP key右端单个元素或 nil
LPOP key count左端批量数组,实际数量可能少于 count
LMOVE src dst两端可指定被移动的元素,源键为空时 nil
LPOP 加 RPUSH 的组合可用于简单的任务重试;需要「转移而不丢」的语义请用 LMOVE,避免弹出后进程崩溃造成任务消失。
同一条命令内弹出多个元素是原子的,但多次调用之间列表可能被其他客户端改动;用 count 做批量消费时,处理失败要把这批元素重新入队或落库补偿。
用 LLEN 配合弹出做积压监控时,多次调用之间数据会变化,数值只适合看趋势;要严格控制队列长度,应在入队侧用 LTRIM 限长或改用 Streams 的消费者组。

易错点

  • 把弹出的元素当可靠消息处理,进程崩溃后任务永久丢失
  • 用 LPOP 轮询代替 BLPOP,空队列时高频空转刷高 QPS 和实例 CPU
  • 批量弹出后处理失败却直接丢弃,没有任何补偿或死信记录
  • 拿 EXISTS 判断队列是否可用:弹空后键被自动删除,返回 0 是正常状态
  • 弹出元素时未记录来源长度,积压与消费速率的关联分析无从下手

数据来源与参考

  • Redis 官方文档: LPOP
  • Redis 官方文档: RPOP

相关工具

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