標籤:
用戶端向伺服器發送一個查詢請求,並監聽 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:158gpfxxxxxxxxxxxxxxxxxxxxx...time withPipeline:22gpfyyyyyyyyyyyyyyyyyyyyy...
可以看出,開啟管道後,效率提升顯著。
Redis - pipelining(管道)