Redis的流水線在Spring中的應用
阿新 • • 發佈:2018-12-21
Spring中執行流水線,使用RedisTemplate提供的executePipelined方法即可.
@Test public void xx() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); final RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class); SessionCallback sessionCallback = (SessionCallback)(RedisOperations ops) ->{ for(int i=0;i<10000;i++){ int j=i+1; ops.boundValueOps("pipeline_key"+j).set("pipeline_value"+j); ops.boundValueOps("pipeline_key"+j).get(); } return null; }; long start = System.currentTimeMillis(); List resultList = redisTemplate.executePipelined(sessionCallback); long end = System.currentTimeMillis(); System.out.println(end-start); System.out.println(resultList); }
輸出:
**461**
[true, pipeline_value1, true, pipeline_value2, true, pipeline_value3, 等等
注意:
流水線會返回一個List,儲存執行多個命令結果,但是當命令很多的時候就得考慮使用迭代的方法去處理,不然記憶體不足發生JVM會發生溢位錯誤。
為了測試流水線的效率:我寫了同樣的程式碼,但是沒有使用流水線:
@Test public void xx() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); final RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class); long start = System.currentTimeMillis(); for(int i=0;i<10000;i++){ int j=i+1; redisTemplate.opsForValue().set("key"+j,"value"+j); redisTemplate.opsForValue().get("key"+j); } long end = System.currentTimeMillis(); System.out.print(end-start); }
輸出:
1316
效率比使用流水線慢了不只兩倍。 提一嘴: 在使用流水線的時候,要考慮其對執行環境記憶體空間的開銷,主要是list的儲存,可以考慮迭代.