什么是 Redis Pipeline?
Pipeline(管道) 是 Redis 提供的一种批量执行命令的优化机制。它允许客户端将多个命令一次性发送给 Redis 服务端,服务端依次执行并批量返回结果,从而大幅减少网络往返次数(RTT)。
Pipeline 的核心优势:
优势 | 说明 |
⚡ 性能提升显著 | 减少网络 IO 次数,QPS 提升 5~10 倍 |
📦 批量操作友好 | 适合批量 |
🧱 简单易用 | 不需要写 Lua 脚本,开发成本低 |
🔄 保持原子性(可选) | 可结合 |
实战演示:使用 Jedis 实现 Pipeline
1. 添加依赖(Maven)
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.1</version>
</dependency>
2. Java 代码示例
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import java.util.List;
public class RedisPipelineDemo {
public static void main(String[] args) {
try (Jedis jedis = new Jedis("localhost", 6379)) {
// 开启 Pipeline
Pipeline pipeline = jedis.pipelined();
// 批量添加命令(不会立即执行)
for (int i = 0; i < 1000; i++) {
pipeline.set("key:" + i, "value-" + i);
}
// 执行所有命令并获取结果
List<Object> results = pipeline.syncAndReturnAll();
System.out.println("成功写入 " + results.size() + " 条数据");
}
}
}
📌 关键点:
pipeline.set()
只是将命令放入缓冲区pipeline.syncAndReturnAll()
才是真正发送并获取结果
其他客户端如何使用 Pipeline?
1. Lettuce(推荐用于 Spring Boot)
StatefulRedisConnection<String, String> connection = client.connect();
RedisAsyncCommands<String, String> async = connection.async();
List<RedisFuture<String>> futures = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
futures.add(async.set("key:" + i, "value-" + i));
}
// 等待所有完成
for (RedisFuture<String> future : futures) {
future.get();
}
2. Spring Data Redis
@Autowired
private RedisTemplate<String, String> redisTemplate;
public void batchSet() {
redisTemplate.executePipelined((RedisCallback<String>) connection -> {
for (int i = 0; i < 1000; i++) {
connection.set(("key:" + i).getBytes(), ("value-" + i).getBytes());
}
return null;
});
}
Pipeline 是提升 Redis 批量操作性能的“银弹”。在面对大量独立命令时,务必优先考虑使用 Pipeline,它可以让你的 Redis QPS 轻松提升 5~20 倍,显著降低系统延迟,提升用户体验。