首页/数据/数据库速查/LPUSH / RPUSH 列表入队
Redis 命令96 条

LPUSH / RPUSH 列表入队

List 是双向链表语义(内存里是 quicklist):LPUSH 从左端插入、RPUSH 从右端插入,返回值是插入后列表长度;常用于队列与时间线。

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

LPUSH / RPUSH 是什么

Redis List 是双向链表语义(内部用 quicklist 实现),LPUSH 从左端插入、RPUSH 从右端插入,一次可以带多个元素,返回值都是插入后的列表长度。两端插入都是 O(1),所以 List 适合做队列、时间线和栈;多个元素是逐个插入的,方向容易搞反。

基本信息

适用版本Redis 全版本
语法LPUSH key elem [elem ...] / RPUSH key elem [elem ...]
返回值插入完成后的列表长度
时间复杂度每个元素 O(1)
相关命令LRANGE / LPOP / RPOP / LLEN / LTRIM

典型使用场景

  • 生产者消费者队列:RPUSH 入、LPOP 出即 FIFO,反向组合即 LIFO 栈
  • 消息缓冲:上游突发写入先落 List,下游按自己的节奏消费
  • 用户时间线:LPUSH 新动态,LRANGE 取前 N 条做首页展示
  • 任务分发:多个 worker 用 BLPOP 阻塞等待,天然实现竞争消费
  • 日志聚合缓冲:先入队再批量落库,避免每条日志一次数据库写入
  • 固定长度记录:配合 LTRIM 保留最近 N 条,做曝光记录或最近浏览
  • 业务分流:不同业务各用独立 key,避免一个慢消费者拖住整条队列

示例

示例
RPUSH queue:email m1 m2 m3   # 返回 3,列表顺序 m1 m2 m3
LPUSH queue:email m0         # 返回 4,m0 在左端:m0 m1 m2 m3
LRANGE queue:email 0 -1      # 查看全量,验证方向是否符合预期
LLEN queue:email             # 当前积压长度,可做监控指标
LPOP queue:email             # 从左侧弹出,与 RPUSH 配对即 FIFO
LTRIM queue:email 0 999      # 只保留前 1000 条,防止时间线无限膨胀

两端操作对照

命令组合进出端结果结构
LPUSH + LPOP同一端进出栈,最后进的最先出
RPUSH + LPOP右进左出FIFO 队列,最常用的组合
LPUSH + RPOP左进右出FIFO 队列的等价组合
LPUSH k a b c逐个头插结果顺序为 c b a,与书写顺序相反
LPUSH 多元素时是逐个头插:LPUSH k a b c 后列表顺序为 c b a,批量方向容易反,用前先 LRANGE 验证一次。
队列要全链路统一方向:生产者用 RPUSH,消费者就必须配 LPOP(或反过来)。中途改方向会让老数据被反向消费,出现乱序。
LPOP 弹出即删除,没有确认机制。需要至少一次投递时用 LMOVE(Redis 6.2+)把元素搬到处理中列表,处理完成后显式删除,超时未完成的再搬回队列。

易错点

  • 生产者和消费者方向没对齐,消息被倒序处理或永远取不到数据
  • List 只入不出且不做 LTRIM:单个 key 涨到几百万元素,内存与删除成本失控
  • 用 List 做队列却不监控 LLEN,积压无人发现直到内存打满
  • 把 List 当可靠队列用:LPOP 弹出后进程崩溃,这条消息即丢失,可靠投递应看 Streams
  • 大 key 集中做 LTRIM 或 UNLINK 会在主线程回收,造成请求毛刺,建议分片存储

数据来源与参考

  • Redis 官方文档: LPUSH
  • Redis 官方文档: RPUSH

相关工具

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