本文使用的是spring-data-redisredis
首先說下redis最簡單得使用,除去配置。spring
須要在你要使用得緩存得地方,例如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 causemybatis
沒法得到redis的連接。app
方法1.從新配置了redis鏈接池得參數:須要按照本身緩存的數量而設置最大連接數。spa
#最大空閒數,數據庫鏈接的最大空閒時間。超過空閒數量,數據庫鏈接將被標記爲不可用,而後被釋放。設爲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要麼集成原生的。
具體狀況酌情處理