關於redis的pipeline

說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();
}

Pipeline與原生M操做區別

咱們知道redis原生有相似 mget mset的批量操做命令,這些命令都是原子的,即會阻塞其餘的命令,知道命令完成返回。而pipeline的每一條命令是拆分過的(非原子),假設打包1000個命令的pipeline傳到服務端,則服務端會把pipeline的每一個命令當成原子。但不管是pipeline仍是M操做 返回的結果都是同樣的。pip

須要注意的點

1.注意沒次pipeline攜帶的數據量(網絡傳輸效率)

2.pipeline每次只能做用在一個redis節點上

相關文章
相關標籤/搜索