什么是 Redis Pipeline?

Pipeline(管道) 是 Redis 提供的一种批量执行命令的优化机制。它允许客户端将多个命令一次性发送给 Redis 服务端,服务端依次执行并批量返回结果,从而大幅减少网络往返次数(RTT)

Pipeline 的核心优势:

优势

说明

⚡ 性能提升显著

减少网络 IO 次数,QPS 提升 5~10 倍

📦 批量操作友好

适合批量 SETGETDEL 等操作

🧱 简单易用

不需要写 Lua 脚本,开发成本低

🔄 保持原子性(可选)

可结合 MULTI/EXEC 实现事务性批量操作

实战演示:使用 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)) {// 开启 PipelinePipeline 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 倍,显著降低系统延迟,提升用户体验。