redis問題及常見配置講解
阿新 • • 發佈:2018-12-26
本文使用的是spring-data-redis
首先說下redis最簡單得使用,除去配置。
需要在你要使用得快取得地方,例如mybatis在mapper.xml中加入:
<cache eviction="LRU" type="cn.jbit.cache.RedisCache"/>
由於是第一次使用redis,再除錯程式碼得時候報錯:Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause
無法獲得redis的連結。
方法1.重新配置了redis連線池得引數:需要按照自己快取的數量而設定最大連結數。
#最大空閒數,資料庫連線的最大空閒時間。超過空閒數量,資料庫連線將被標記為不可用,然後被釋放。設為0表示無限制 redis.maxIdle=50 #最大連線數:能夠同時建立的“最大連結個數”#jedis的最大活躍連線數設為0表示無限制,這個屬性就是高版本的maxTotal redis.maxActive=50
#最大等待時間:單位ms #jedis池沒有連線物件返回時,等待可用連線的最大時間,單位毫秒,預設值為-1,表示永不超時。 #如果超過等待時間,則直接丟擲JedisConnectionException redis.maxWait=1000##############################問題註解############################### 註解:執行報錯:Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause maxActive是最大啟用連線數,這裡取值為50,表示同時最多有50個數據連 接。maxIdle是最大的空閒連線數,這裡取值為50, 表示即使沒有資料庫連線時依然可以保持20空閒的連線,而不被清除,隨時處於待命狀態。MaxWait是最大等待秒鐘數,這裡取值-1, 表示無限等待,直到超時為止,一般取值3000,表示3秒後超時。
而自己開始的設定是:redis.maxIdle=10 redis.maxActive=50
######################################################################### 如果問題繼續存在
方法2.問題還是沒解決,多次除錯,發現連結資源沒釋放有關係,當然我的程式碼中是做了資源釋放的。 先看poolConfig
<!-- redis資料來源 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxTotal" value="${redis.maxActive}" />
<property name="maxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> redis.properties檔案配置
#最大連結數 redis.maxTotal=100 #最大空閒數,資料庫連線的最大空閒時間。超過空閒數量,資料庫連線將被標記為不可用,然後被釋放。設為0表示無限制 redis.maxIdle=20 ##jedis的最大活躍連線數設為0表示無限制 redis.maxActive=100 #最大等待時間:單位ms #jedis池沒有連線物件返回時,等待可用連線的最大時間,單位毫秒,預設值為-1,表示永不超時。 #如果超過等待時間,則直接丟擲JedisConnectionException redis.maxWait=1000 #使用連線時,檢測連線是否成功 redis.testOnBorrow=true redis檔案
public void clear() { JedisConnection connection = null; try { connection = jedisConnectionFactory.getConnection(); connection.flushDb(); connection.flushAll(); System.out.println("clear=redis======>"); } catch (JedisConnectionException e) { connection.close();//釋放連結 e.printStackTrace(); } finally { if (connection != null) { connection.close();//釋放連線 } } }
問題的主要原因是使用連線池的連結後沒有釋放資源,當然開始我的程式碼就釋放了使用的連結資源,但是還是會出現連結資源拿不到的情況。 可能是因為異常沒有釋放連結資源,我這個getConnection()是使用的第三方靜態注入依賴於ehcache,只需要在需要快取的dao或者mapper 加入註解,即可快取並同步重新整理最新資料。不需要在業務層手動的set,update,remove資料。 如果是getResource()這種方式獲取的redis連結,用returnToPool(jedis)或jedis.close()是可以解決問題的;
具體情況酌情處理