redis連線釋放問題記錄

2021-10-23 10:27:12 字數 1412 閱讀 5718

記錄一次在壓測後發現的redistemplate使用場景下,redis的連線資源沒有釋放的問題。

springboot 版本:2.1.2(排除了lettuce的依賴)

jedis版本:2.9.1

場景:高併發情況下,redistemplate獲取連線失敗並阻塞執行緒導致tps下降。

異常描述:如果設定了max-wait則在等待時間到後丟擲異常:timeout waiting for idle object。如果沒有設定,則執行緒將被一直阻塞。

public t borrowobject

(long borrowmaxwaitmillis)

throws exception

else}if

(p == null)

//.......

}

阻塞點在this.idleobjects.takefirst()方法,如果設定了等待時間,則呼叫pollfirst()。debug可以發現,資源沒有釋放。

這個可以看當前物件中的borrowedcount和returnedcount發現,borrowedcount大於returnedcount。

borrowedcount:借用的資源計數

returnedcount:歸還的資源計數

borrowobject(long borrowmaxwaitmillis):獲取資源的方法

returnobject(t obj):歸還資源的方法

本來以為是歸還資源的方法有bug導致的資源沒有歸還,但是經過多次debug分析後,發現問題點實際在於jedis的close方法上。

public

void

close()

else

//問題點在於這裡

this

.datasource = null;

}else

}

場景描述:

在多執行緒環境下,通過debug可以看到,當前jedis物件是共享的。

假如有執行緒1,2.

當執行緒1獲取的資源的持有,執行緒2等待資源釋放場景。

然後執行緒1在執行close時,通過returnresource釋放了資源,而執行緒2拿到了資源。

然後執行緒2也執行到了close方法,而執行緒1執行了this.datasource = null;

這時執行緒2則不會歸還資源,直接執行了close,導致出現的連線沒有釋放問題。

github issues描述

解決方式:

公升級jedis版本或者回退jedis版本。

更換連線,可以考慮使用lettuce。

ios crash問題記錄

1.誤將nsmutablearray型別的變數初始化為nsarray,結果對nsmutablearray型別變數進行操作時,crash h檔案如下 inte ce movemecontroller secondlevelviewcontroller property nonatomic,retain...

??? nginx lua問題記錄

問題1 當用http localhost test 訪問時,結果為何迥異?eg1 location test 結果為空,說明執行的是httpechomodule的echo指令,沒有執行httpluamodule的content by lua指令 eg2 location test輸出123 說明執行...

sphinx 問題記錄

indexer error while loading shared libraries libmysqlclient.so.18 cannot open shared object file no such file or directory 發現sphinx indexer依賴庫ibmysqlc...