平常排雷:redis報錯 could not get a resource from the pool

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);

再運行調試,搞定~~收工~~
相關文章
相關標籤/搜索