java客戶端與redis服務器之間使用tcp協議進行通信,客戶端向服務器每發送一條語句,就會阻塞等待結果,如果有多條命令,那麼這個發送語句和等待結果的時間就比較長了。管道的作用就是將這多條語句打包一起發送給服務器,這樣,無論有多少條語句,都只需要一次發送,一次等待的時間就可以了。先看代碼。
Jedis jedis = new Jedis("192.168.229.128", 6379);
// 開啓管道
Pipeline pipelined = jedis.pipelined();
for(int i = 0; i < 100000; i++){
pipelined.set(i + "", i + "");
}
// 提交命令
pipelined.sync();
可以看出,使用redis.clients.jedis.Pipeline的一個實例化的對象代替了redis.clients.jedis.Jedis,使用sync()方法發送語句並等待語句執行結果。
使用管道需要注意以下幾點:
1. 每條命令都不能依賴於之前命令的執行結果
2. 如果中間某條命令執行失敗,不影響之後命令的執行
3. 管道中的每條命令執行期間,可以有其他線程的命令插隊執行,這點與redis的事物不一樣
4. 由於redis需要處理完所有命令之後再返回客戶端結果,因此在這之前,需要在內存中緩存已處理完命令的結果,所以並不是打包的命令越多越好