Redis中PipeLine使用
阿新 • • 發佈:2018-12-25
(一)簡介
Redis客戶端與Redis之間使用TCP協議進行連線,一個客戶端可以通過一個socket連線發起多個請求命令。每個請求命令發出後client通常會阻塞並等待redis服務處理,redis處理完後請求命令後會將結果通過響應報文返回給client,因此當執行多條命令的時候都需要等待上一條命令執行完畢才能執行,如:get ‘0’,get ‘1’,get ‘2’
Redis客戶端與Redis之間使用TCP協議進行連線,一個客戶端可以通過一個socket連線發起多個請求命令。每個請求命令發出後client通常會阻塞並等待redis服務處理,redis處理完後請求命令後會將結果通過響應報文返回給client,因此當執行多條命令的時候都需要等待上一條命令執行完畢才能執行,如:get ‘0’,get ‘1’,get ‘2’
其執行過程如下圖所示:
而管道(pipeline)可以一次性發送多條命令並在執行完後一次性將結果返回,pipeline通過減少客戶端與redis的通訊次數來實現降低往返延時時間,其過程如下圖所示
(二)普通方式與pipeline的比較
1.測試環境:
redis版本2.4.15
jedis版本2.2.1
2.測試程式碼
分別向redis中插入100、500、1000、2000、5000、10000資料
- long start=System.currentTimeMillis();
- for (int i = 0; i <50000; i++) {
- redis.set(String.valueOf(i),String.valueOf(i));
- }
- long end=System.currentTimeMillis();
- logger.info("the total time is:"+(end-start));
- Pipeline pipe=redis.pipelined();
- long start_pipe=System.currentTimeMillis();
- for (int i = 0; i <50000; i++) {
- pipe.set(String.valueOf(i),String.valueOf(i));
- }
- pipe.sync();
- long end_pipe=System.currentTimeMillis();
- logger.info("the pipe total time is:"+(end_pipe-start_pipe));
long start=System.currentTimeMillis();
for (int i = 0; i <50000; i++) {
redis.set(String.valueOf(i),String.valueOf(i));
}
long end=System.currentTimeMillis();
logger.info("the total time is:"+(end-start));
Pipeline pipe=redis.pipelined();
long start_pipe=System.currentTimeMillis();
for (int i = 0; i <50000; i++) {
pipe.set(String.valueOf(i),String.valueOf(i));
}
pipe.sync();
long end_pipe=System.currentTimeMillis();
logger.info("the pipe total time is:"+(end_pipe-start_pipe));
測試結果對比: