1. 程式人生 > >Redis的流水線在Spring中的應用

Redis的流水線在Spring中的應用

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的儲存,可以考慮迭代.