redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resourc


使用redis作為緩存工具,很容易出現從redis連接池中得不到連接的問題。而使用redis連接池獲取連接的時候,往往是在高並發情形下,出現如題所示的問題。本人一般從如下幾個方面排查,經驗之談~

 

1)首先判斷redis連接參數是否配置正確?很有可能,之前一直能取,但現在突然出現異常,很有可能是redis的服務器down掉了,或者redis的連接條件被更改;

2)網絡權限更改:做過項目就很容易知道,每種環境的權限是不同的,很有可能你項目所在的網段連接redis的權限被更改,導致之前一直可以獲取redis連接,但現在卻無法獲取。

3)查代碼:一般而言,從redis里面獲取連接取數據,完畢之后應該立即歸還到池中。應該注意的是,一般都會用典型的try{}  catch{} finally{}結構包圍,在finally{}中釋放連接(這樣可以確保無論是否發生異常,redis的連接都能及時被歸還到連接池中);

4)歸還redis連接必須要注意的一點,如:

//從連接池獲取連接
Jedis jedis = pool.getResource();
try{
   
}catch(Exception e) {
    e.printStackTrace();
}finally{
   //歸還連接到redis池中
   poo.returnResource();
}
 這段代碼看起來很滿足3)的規范,在finally里歸還了連接。但!有一個隱藏的容錯性考慮,當Jedis jedis = pool.getResource();這段代碼發生異常時,finally的代碼是不會被執行的。我可以模擬一下,

 

 

String str = null;
System.out.println(str.length());//模擬異常
try{
    System.out.println("模擬從redis取數據");
}catch(Exception e) {
    e.printStackTrace();
}finally{
    System.out.println("連接釋放。。。");
}
 運行報異常,finally里面的代碼不會被執行。所以,應該改成這樣:

 

 

//從連接池獲取連接
Jedis jedis = null;
try{
   jedis = pool.getResource();
}catch(Exception e) {
    e.printStackTrace();
}finally{
   //歸還連接到redis池中
   poo.returnResource();
}
 當然,這是由於try catch finally的機制決定,但很容易被忽視~

 

5)關閉redis的持久化,提高redis的存取性能:當使用redis緩存的數據越來越多的時候,可以考慮關閉redis的持久化功能。具體做法是:修改redis配置文件,注釋掉原來的持久化規則,將redis.conf代碼

save 900 1

save 300 10

save 60 10000

注釋,修改為 save " ",然后重啟redis服務器即可~

 

再不濟的話,提高redis池連接個數和最大空閑數等參數……


免責聲明!

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



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