redis client 2.0.0 pipeline 的list的rpop bug
阿新 • • 發佈:2017-07-01
edi resp response pub pop clas space finally void
描寫敘述:
redis client 2.0.0 pipeline 的list的rpop 存在嚴重bug,rpop list的時候,假設list已經為空的時候,rpop出來的Response依舊不為null,導致吊response.get()方法拋異常
代碼:
@Test public void testRedisPipeline(){ Jedis jedis = null; try{ jedis = new Jedis("127.0.0.1",6379); Pipeline pipelined = jedis.pipelined(); for(int i=200;i<10000;i++){ pipelined.lpush("aa", "val"+i); } pipelined.sync(); }catch(Exception e){ e.printStackTrace(); }finally{ if(jedis!=null){ jedis.disconnect(); } } }
<span style="white-space:pre"> </span>//這種方法會造成redis qps無限上升 @Test public void testRedisPipelinePop(){ Jedis jedis = null; try{ List<Response<String>> result = new ArrayList<Response<String>>(); jedis = new Jedis("127.0.0.1",6379); Pipeline pipelined = jedis.pipelined(); for(int i=0;i<10;i++){ //System.out.println(i); Response<String> rpop = pipelined.rpop("aa"); //System.out.println(rpop); result.add(rpop); } pipelined.sync(); //Response<Long> r = pipelined.bitcount("aa"); for (Response<String> response : result) { System.out.println(response.get());//異常 } }catch(Exception e){ e.printStackTrace(); }finally{ if(jedis!=null){ jedis.disconnect(); } } }
解決方法:
使用redis-cli 2.1.0以上版本號
redis client 2.0.0 pipeline 的list的rpop bug