最近在使用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; } } }