Redis Pipeline 详解

批量命令执行,告别 N 次往返延迟

问题:逐条命令的 RTT 困境

Redis 基于 TCP 协议的请求-响应模型

Redis 使用 TCP 长连接,每个命令都需要经历:发送请求 → 服务器处理 → 返回响应 的完整过程。

当需要执行 N 条命令时,每一次 RTT(Round Trip Time)都会成为性能瓶颈。

N
RTT 次数(普通模式)
1
RTT 次数(Pipeline 模式)
RTT
网络往返时间(假设 1ms)

流程对比

普通模式(逐条执行)
Client → Server
GET key1
等待 RTT #1 返回
Client → Server
GET key2
等待 RTT #2 返回
Client → Server
GET key3
等待 RTT #3 返回
总耗时 = 3 × RTT
Pipeline 模式(批量执行)
GET key1 命令1
GET key2 命令2
GET key3 命令3
一次性打包发送

网络传输

多个命令合并为一次 TCP 报文

批量返回
[value1, value2, value3] 一次性返回
总耗时 = 1 × RTT

交互式动画演示

客户端
点击按钮开始演示...
网络
RTT ≈ 1ms
Redis 服务器
处理命令
总耗时
-

Pipeline 工作原理

1

客户端缓存

将多个命令存入客户端缓冲区

2

打包发送

批量发送到 Redis 服务器

3

顺序执行

Redis 串行执行所有命令

4

批量返回

一次性返回所有结果

注意:Pipeline 只是将多个命令打包发送,Redis 本身仍然是串行执行命令的。 这与事务(MULTI/EXEC)的原子性不同,Pipeline 不保证原子性。

代码示例

// 普通模式:10 个命令 = 10 次 RTT for (i = 0; i < 10; i++) { redis.get("key" + i); // 每次都等待响应 } // Pipeline 模式:10 个命令 = 1 次 RTT Pipeline pipeline = redis.pipelined(); for (i = 0; i < 10; i++) { pipeline.get("key" + i); // 只写入缓冲区 } List results = pipeline.sync(); // 一次性获取所有结果

Pipeline 优势

大幅降低延迟

将 N 次 RTT 减少为 1 次,
10 条命令延迟降低 90%

提升吞吐量

减少网络开销,
提高 Redis 服务端处理效率

批量操作友好

适合批量读写、批量写入等场景,
如导入数据、批量更新缓存

API 简单易用

大多数 Redis 客户端都提供
开箱即用的 Pipeline 支持

适用场景

批量获取用户信息

GET user:1, user:2, ... user:100

批量写入日志/数据

批量导入、缓存预热等场景

批量聚合查询

SCAN + Pipeline 遍历大量 Key

高频计数器

批量 INCR/INCRBY 操作

注意事项

⚠️ 使用注意点

  • 不保证原子性:Pipeline 中间某条命令失败不会影响其他命令
  • 内存占用:返回结果会暂存客户端内存,数据量过大需分批
  • 结果顺序:返回顺序与发送顺序一致
  • 不支持管道链式事务:如需原子性,使用 MULTI/EXEC