关键词:Pipeline
Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。通常情况下,一个 Redis 命令的请求、响应遵循以下步骤:
显然,如果每个 Redis 命令都发起一次请求、响应,会很低效。因此,Redis 客户端提供了一种批量处理技术,即管道技术(Pipeline)。Pipeline 的工作原理就是:将多个 Redis 命令一次性发送给服务端,服务端处理后,统一返回给客户端。由于减少了通信次数,自然提升了处理效率。
在使用 Redis 管道技术时,要注意一些限制,避免踩坑:
主流的 Redis 客户端,一般都会支持管道技术。
【示例】Jedis 管道使用示例
public class Demo {
public static void main(String[] args) {
String host = "localhost";
int port = 6379;
Jedis jedis = new Jedis(host, port);
String key = "pipeline:test";
jedis.del(key);
// -------- 方法1
method1(jedis, key);
//-------- 方法2
method2(jedis, key);
}
private static void method2(Jedis jedis, String key) {
System.out.println("-----方法2-----");
jedis.del(key);//初始化
Pipeline pipeline = jedis.pipelined();
//需要先声明Response
Response<Long> r1 = pipeline.incr(key);
System.out.println("Pipeline发送请求");
Response<Long> r2 = pipeline.incr(key);
System.out.println("Pipeline发送请求");
Response<Long> r3 = pipeline.incr(key);
System.out.println("Pipeline发送请求");
Response<Long> r4 = pipeline.incr(key);
System.out.println("Pipeline发送请求");
Response<Long> r5 = pipeline.incr(key);
System.out.println("Pipeline发送请求");
try {
// 此时还未开始接收响应,所以此操作会出错
r1.get();
} catch (Exception e) {
System.out.println(" <<< Pipeline error:还未开始接收响应 >>> ");
}
// 发送请求完成,开始接收响应
System.out.println("发送请求完成,开始接收响应");
pipeline.sync();
System.out.println("Pipeline 接收响应 Response: " + r1.get());
System.out.println("Pipeline 接收响应 Response: " + r2.get());
System.out.println("Pipeline 接收响应 Response: " + r3.get());
System.out.println("Pipeline 接收响应 Response: " + r4.get());
System.out.println("Pipeline 接收响应 Response: " + r5.get());
jedis.close();
}
private static void method1(Jedis jedis, String key) {
Pipeline pipeline = jedis.pipelined();
System.out.println("-----方法1-----");
for (int i = 0; i < 5; i++) {
pipeline.incr(key);
System.out.println("Pipeline 发送请求");
}
// 发送请求完成,开始接收响应
System.out.println("发送请求完成,开始接收响应");
List<Object> responses = pipeline.syncAndReturnAll();
if (responses == null || responses.isEmpty()) {
jedis.close();
throw new RuntimeException("Pipeline error: 没有接收到响应");
}
for (Object resp : responses) {
System.out.println("Pipeline 接收响应 Response: " + resp.toString());
}
System.out.println();
}
}