redis鎖

? ? ? ? 簡單說一下,redis鎖主要解決并發(fā)量大的情況下,代碼被重復(fù)執(zhí)行。比如一件商品的庫存值為50,在多個線程同時進入去修改商品的庫存值時,會出現(xiàn)該商品會被同時修改兩次為48,就會造成我們數(shù)據(jù)的錯亂 ,明明商品購買記錄是兩次,庫存量卻只減少了1。

? ? ? ? 所以我們基于這種情況可以用到redis的鎖機制,它可以讓每個線程一一排隊去執(zhí)行修改庫存的記錄,第一個改完第二個才會去改,當然這里會給每一把鎖加上唯一標識,并在最后銷毀的時候判斷是不是該線程的鎖,要不會出現(xiàn)一種情況,我銷毀掉了不屬于自己的線程鎖,最后在把redis的鎖釋放掉,相當于銷毀。

? ? ? ? 問題來了,在我們加上鎖時,執(zhí)行業(yè)務(wù)代碼的時候,突然拋出了異常,導(dǎo)致當前線程崩潰,從而沒有銷毀掉鎖,那么后面的線程就會一直等待,就造成了死鎖。解決的方案就是把異常try了,把銷毀步驟放在finally里面,這樣就可以排除掉代碼異常了。

? ? ? ? 有一種特殊的情況,如果在系統(tǒng)掛掉情況下,異常還沒拋出,還沒執(zhí)行finally里面的代碼,同樣也會造成死鎖,這時我們就是用到redis的延時執(zhí)行,在加上鎖的同時給這把鎖加上十秒的延時,十秒后自動釋放掉這把鎖,這種情況理論上可以解決我們的問題,但在延時的過程中,如果我們執(zhí)行的業(yè)務(wù)代碼需要十幾秒的時間,那么就會出現(xiàn)每個十秒后會釋放掉不屬于自己的鎖。

? ? 目前這種已經(jīng)能解決并發(fā)量不大的情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容