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+)把元素搬到处理中列表,处理完成后显式删除,超时未完成的再搬回队列。