本文使用的是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()是可以解決問題的;
最讓我們忽略的原因就是你的redis是山寨版集成的,從新手博客上直接copy被坑的不要不要的。要么用spring boot集成的redis要么集成原生的。
具體情況酌情處理
