客户端向服务器发送一个查询请求,并监听 socket 返回,等待服务器响应。通常是阻塞模式,在收到服务器响应之前是挂起的,不能继续发送请求。
可以使用管道来改善这种情况。在使用管道的情况下,客户端可以请求服务器而不必理会服务器是否有回复。这样就可以一次发出多个命令。
下面是 Jedis 一般情况下和开启管道后发送一系列请求所用时间的对比。
public class PipelineTest { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); withoutPipeline(jedis); withPipeline(jedis); } private static void withoutPipeline(Jedis jedis){ long start = System.currentTimeMillis(); jedis.set("name", "gpf"); for (int i = 0; i < 1000; i++) { jedis.append("name", "x"); } long end = System.currentTimeMillis(); jedis.disconnect(); System.out.println("time withoutPipeline:"+(end-start)); System.out.println(jedis.get("name")); } private static void withPipeline(Jedis jedis){ long start = System.currentTimeMillis(); jedis.set("name", "gpf"); Pipeline pl = jedis.pipelined(); for (int i = 0; i < 1000; i++) { pl.append("name", "y"); } pl.sync(); long end = System.currentTimeMillis(); System.out.println("time withPipeline:"+(end-start)); System.out.println(jedis.get("name")); } }
多次测试结果均如下面结果所示:
time withoutPipeline:158 gpfxxxxxxxxxxxxxxxxxxxxx... time withPipeline:22 gpfyyyyyyyyyyyyyyyyyyyyy...
可以看出,开启管道后,效率提升显著。
时间: 2024-10-09 03:33:34