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 的消费者组。