1)什么是流水線
批量傳遞n條命令給Redis服務(wù)器執(zhí)行茧痒,節(jié)省n-1次網(wǎng)絡(luò)傳輸時間侈百。
注意:
Redis命令的執(zhí)行時間是微秒級別
pipline每次條數(shù)要控制(網(wǎng)絡(luò))
遠距離傳輸大概網(wǎng)絡(luò)耗時圖
2)客戶端實現(xiàn)
/**
* 環(huán)境:Redis5.0.4 : 本機redis-server 1萬次 hset
* 608ms
*/
public static void bigHashMap(Jedis jedis) {
System.out.println("--->Starting set bigMap");
long t1 = System.currentTimeMillis();
for(int i = 0; i < 10000; i++)
jedis.hset("bigMap01", "key"+i, "value"+i);
long t2 = System.currentTimeMillis();
System.out.println("--->set bigMap is endding! It takes " + (t2-t1) + "ms");
}
/**
* 環(huán)境:Redis5.0.4 : 本機redis-server 用pipeline 1萬次 hset
* 125ms
*/
public static void bigHashMapPiepline(Jedis jedis) {
System.out.println("--->Starting pipeline set bigMap");
long t1 = System.currentTimeMillis();
Pipeline piepline = jedis.pipelined();
for(int i = 0; i < 10000; i++)
piepline.hset("bigMap02", "key"+i, "value"+i);
piepline.syncAndReturnAll();
long t2 = System.currentTimeMillis();
System.out.println("--->pipeline set bigMap is endding! It takes " + (t2-t1) + "ms");
}
3)與原生操作Mset Mget M~對比
原生的m操作是原子操作
pipeline非原子运提,pipeline會在服務(wù)器端被拆分成獨立的命令執(zhí)行
4)使用建議
- 注意每次pipeline攜帶數(shù)據(jù)量
- pipeline每次只能作用在一個Redis節(jié)點上
- M操作與pipeline的區(qū)別