說pipeline以前首先明確兩點java
redis的1次網絡命令的耗時爲 :1次網絡時間 + 1次命令執行時間redis
redis的n次網絡命令的耗時爲: n次網絡時間 + n次命令執行時間網絡
有了上面的計算,咱們知道,若是咱們要對redis進行一個批量的操做,是很耗時的,但咱們又知道,redis的命令執行時間一般來講是很是快的,最關鍵的耗時實際上是在網絡傳輸的時間上。pipeline就是用來將n次的網絡時間優化爲一次的網絡時間。優化
pipeline是將n個命令一次性打包,發送到服務端逐個執行,耗時爲:1次網絡時間 + n次命令時間spa
由此看來,pipeline能夠大大減少咱們網絡時間的開銷,可是在使用時,仍然須要注意一個點,即 pipeline每次的條數須要控制(網絡環境相對複雜)code
下面來看一個插入10000條hash對比ip
沒有使用pipline 耗時 50sget
Jedis jedis = new Jedis("127.0.0.1",6379); for( int i=0; i<10000; i++){ jedis.hset("hashkey:"+i,"field"+i,"value"+i); }
使用pipline 耗時 0.7shash
Jedis jedis = new Jedis("127.0.0.1",6379); for(int i=0; i<100; i++){ Pipeline pipeline = jedis.pipelined(); for(int j=i*100; j<(i+1)*100; j++){ pipeline.hset("hashkey:"+j,"field"+j,"value"+j); } pipeline.syncAndReturnAll(); }
咱們知道redis原生有相似 mget mset的批量操做命令,這些命令都是原子的,即會阻塞其餘的命令,知道命令完成返回。而pipeline的每一條命令是拆分過的(非原子),假設打包1000個命令的pipeline傳到服務端,則服務端會把pipeline的每一個命令當成原子。但不管是pipeline仍是M操做 返回的結果都是同樣的。pip
1.注意沒次pipeline攜帶的數據量(網絡傳輸效率)
2.pipeline每次只能做用在一個redis節點上