redis 報錯 could not get a resource from the pool
今天遇到一個問題
在模擬環境上進行測試,調用redis獲取數據時報錯,提示 could not get a resource from the pool
報錯代碼,以下紅色字體:
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++ }
結果:正常!!!難道不是這么測的?先排除這種問題的可能
試試其它法子:
假設是模擬環境的操作量過多未釋放,那么重啟模擬環境服務,即可以初始化redis連接池,重啟后立即去操作報錯功能試試
發現操作完,還是報同樣錯誤
結論:不是實例使用后沒有被釋放的問題導致
- 本地環境和模擬環境的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);
再運行調試,搞定~~收工~~