jedis2.1.0的一個bug

 

最近在使用jedis工程中,因爲一些緣由,使用的還是較低版本的jedis版本的。使用jedis時圖省事,直接經過new 一個jedis的對象使用。以後出現了ArrayIndexOutOfBoundsException的錯誤:java

具體爲:數組

追蹤源代碼發現是write方法中經過遞增count,向緩存字節數組中寫入數據時出現的ArrayIndexOutOfBoundsException。緩存

 public RedisOutputStream(final OutputStream out) {
        this(out, 8192);
    }
 public RedisOutputStream(final OutputStream out) {
        this(out, 8192);
    }
  private void flushBuffer() throws IOException {
        if (count > 0) {
            out.write(buf, 0, count);
            count = 0;
        }
    }

    public void write(final byte b) throws IOException {
        buf[count++] = b;
        if (count == buf.length) {
            flushBuffer();
        }
    }

 

 

 

 

在flush時的時候一旦出錯,且源碼並未catch,致使count不會清0,以後就會一直報越界的錯誤。新版本的jedis應該已經修復此錯誤。另外,也能夠參照網上的一些jedis pool的方法,來主動catch這個錯誤:this

 

public static Set<String> getSetData(String key) {
  Jedis jedis = null;
  try {
      jedis = jedisPool.getResource();
      Set<String> set = jedis.smembers(key);
      return set;
  } catch(Exception e){
      if(jedis != null) {
      jedisPool.returnBrokenResource(jedis);
      }
      logger.error("ERROR_Redis| getSetData Exception! key=" + key ,e);
      return null;
  } finally{
      if(jedis != null){
      jedisPool.returnResource(jedis);
      jedis = null;
      }
  }
}
相關文章
相關標籤/搜索