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


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

再運行調試,搞定~~收工~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM