redis 報錯 could not get a resource from the pooljava
今天遇到一個問題redis
在模擬環境上進行測試,調用redis獲取數據時報錯,提示 could not get a resource from the poolspring
報錯代碼,如下紅色字體:運維
1 try(Jedis jedis = POOL.getResource()) { 2 return jedis.get(key); 3 }
因而進行排查,本地開發環境調試,發現正常啊,啥狀況?測試
難道本地環境和模擬環境有啥差別???字體
- 模擬環境的用戶多,操做redis量也多,實例使用後沒用被釋放致使的?
因而,本地創建循環 20000次 獲取實例不釋放,int i=0;while(i<20000){Jedis jedis = POOL.getResource();i++ }spa
結果:正常!!!難道不是這麼測的?先排除這種問題的可能調試
試試其它法子:code
假設是模擬環境的操做量過多未釋放,那麼重啓模擬環境服務,便可以初始化redis鏈接池,重啓後當即去操做報錯功能試試blog
發現操做完,仍是報一樣錯誤
結論:不是實例使用後沒有被釋放的問題致使
- 本地環境和模擬環境的redis配置不同?
不是釋放致使的,那只有這種可能
叫運維幫忙拉取配置本身進行對比,發現除了ip、端口、密碼不同,其它都同樣。
等等,本地環境的redis有密碼,驗證環境的redis 密碼爲空,難道是這個引發?
因而叫運維設置一下驗證環境redis 的密碼。。。溝通失敗。。沒設置成功,
那隻能本身本地測試了,redis 空字符串密碼是否是有啥問題?
本地運行:確實空字符串密碼, POOL.getResource() 直接報 could not get a resource from the pool
問題找到,密碼的問題!!
- 開始解決
百度查詢redis 空(null)密碼 和空字符("")密碼,是否有區別,發下確實有人遇到相似問題!!!
如下截圖百度出來的:
既然這樣,那就把「」 和 null 須要區別開來,方案:若是redis配置密碼爲空「」, 代碼裏直接設置把密碼設置成null
代碼:
redis配置:
1 redis: 2 database: 8 3 host: 192.168.0.101 4 port: 6379 #新的實例 5 password: # 密碼(默認爲空) 6 timeout: 6000 # 鏈接超時時長(毫秒)
java 代碼:
1 @Value("${spring.redis.password}") 2 private String jedisPassword; 3 4 //新增密碼處理 5 //把""設置成null 6 if ("".equals(jedisPassword.trim())) { 7 jedisPassword = null; 8 } 9 JedisPool pool = new JedisPool(config, jedisHost, jedisPort, 0, jedisPassword);
再運行調試,搞定~~收工~~