redisson是如何解決死鎖問題的

這篇文章主要講解了“redisson是如何解決死鎖問題的”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“redisson是如何解決死鎖問題的”吧!

創(chuàng)新互聯(lián)專注于靜海網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供靜海營(yíng)銷型網(wǎng)站建設(shè),靜海網(wǎng)站制作、靜海網(wǎng)頁(yè)設(shè)計(jì)、靜海網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造靜海網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供靜海網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

有關(guān)Redisson作為實(shí)現(xiàn)分布式鎖,總的分3大模塊來講。

  1.  `1、Redisson實(shí)現(xiàn)分布式鎖原理`

  2.  `2、Redisson實(shí)現(xiàn)分布式鎖的源碼解析`
    
  3.  `3、Redisson實(shí)現(xiàn)分布式鎖的項(xiàng)目代碼(可以用于實(shí)際項(xiàng)目中)`

一、高效分布式鎖

當(dāng)我們?cè)谠O(shè)計(jì)分布式鎖的時(shí)候,我們應(yīng)該考慮分布式鎖至少要滿足的一些條件,同時(shí)考慮如何高效的設(shè)計(jì)分布式鎖,這里我認(rèn)為以下幾點(diǎn)是必須要考慮的。

1、互斥

在分布式高并發(fā)的條件下,我們最需要保證,同一時(shí)刻只能有一個(gè)線程獲得鎖,這是最基本的一點(diǎn)。

2、防止死鎖

在分布式高并發(fā)的條件下,比如有個(gè)線程獲得鎖的同時(shí),還沒有來得及去釋放鎖,就因?yàn)橄到y(tǒng)故障或者其它原因使它無(wú)法執(zhí)行釋放鎖的命令,導(dǎo)致其它線程都無(wú)法獲得鎖,造成死鎖。

所以分布式非常有必要設(shè)置鎖的 有效時(shí)間,確保系統(tǒng)出現(xiàn)故障后,在一定時(shí)間內(nèi)能夠主動(dòng)去釋放鎖,避免造成死鎖的情況。

3、性能

對(duì)于訪問量大的共享資源,需要考慮減少鎖等待的時(shí)間,避免導(dǎo)致大量線程阻塞。

所以在鎖的設(shè)計(jì)時(shí),需要考慮兩點(diǎn)。

1、 鎖的顆粒度要盡量小。比如你要通過鎖來減庫(kù)存,那這個(gè)鎖的名稱你可以設(shè)置成是商品的ID,而不是任取名稱。這樣這個(gè)鎖只對(duì)當(dāng)前商品有效,鎖的顆粒度小。

2、 鎖的范圍盡量要小。比如只要鎖2行代碼就可以解決問題的,那就不要去鎖10行代碼了。

4、重入

我們知道ReentrantLock是可重入鎖,那它的特點(diǎn)就是:同一個(gè)線程可以重復(fù)拿到同一個(gè)資源的鎖。重入鎖非常有利于資源的高效利用。關(guān)于這點(diǎn)之后會(huì)做演示。

針對(duì)以上Redisson都能很好的滿足,下面就來分析下它。

二、Redisson原理分析

為了更好的理解分布式鎖的原理,我這邊自己畫張圖通過這張圖來分析。

redisson是如何解決死鎖問題的

1、加鎖機(jī)制

線程去獲取鎖,獲取成功: 執(zhí)行l(wèi)ua腳本,保存數(shù)據(jù)到redis數(shù)據(jù)庫(kù)。

線程去獲取鎖,獲取失敗: 一直通過while循環(huán)嘗試獲取鎖,獲取成功后,執(zhí)行l(wèi)ua腳本,保存數(shù)據(jù)到redis數(shù)據(jù)庫(kù)。

2、watch dog自動(dòng)延期機(jī)制

這個(gè)比較難理解,找了些許資料感覺也并沒有解釋的很清楚。這里我自己的理解就是:

在一個(gè)分布式環(huán)境下,假如一個(gè)線程獲得鎖后,突然服務(wù)器宕機(jī)了,那么這個(gè)時(shí)候在一定時(shí)間后這個(gè)鎖會(huì)自動(dòng)釋放,你也可以設(shè)置鎖的有效時(shí)間(不設(shè)置默認(rèn)30秒),這樣的目的主要是防止死鎖的發(fā)生。

但在實(shí)際開發(fā)中會(huì)有下面一種情況:

  1.   `//設(shè)置鎖1秒過去`
  2.   `redissonLock.lock("redisson",  1);`
  3.   `/** 
  4.   `* 業(yè)務(wù)邏輯需要咨詢2秒`
  5.   `*/`
  6.   `redissonLock.release("redisson");`
  7.   `/**` 
  8.   `* 線程1 進(jìn)來獲得鎖后,線程一切正常并沒有宕機(jī),但它的業(yè)務(wù)邏輯需要執(zhí)行2秒,這就會(huì)有個(gè)問題,在 線程1 執(zhí)行1秒后,這個(gè)鎖就自動(dòng)過期了,` 
  9.   `* 那么這個(gè)時(shí)候 線程2 進(jìn)來了。那么就存在 線程1和線程2 同時(shí)在這段業(yè)務(wù)邏輯里執(zhí)行代碼,這當(dāng)然是不合理的。`
  10.   `* 而且如果是這種情況,那么在解鎖時(shí)系統(tǒng)會(huì)拋異常,因?yàn)榻怄i和加鎖已經(jīng)不是同一線程了,具體后面代碼演示。`
  11.   `*/`

所以這個(gè)時(shí)候 看門狗就出現(xiàn)了,它的作用就是 線程1 業(yè)務(wù)還沒有執(zhí)行完,時(shí)間就過了,線程1 還想持有鎖的話,就會(huì)啟動(dòng)一個(gè)watch dog后臺(tái)線程,不斷的延長(zhǎng)鎖key的生存時(shí)間。

注意 正常這個(gè)看門狗線程是不啟動(dòng)的,還有就是這個(gè)看門狗啟動(dòng)后對(duì)整體性能也會(huì)有一定影響,所以不建議開啟看門狗。

3、為啥要用lua腳本呢?

這個(gè)不用多說,主要是如果你的業(yè)務(wù)邏輯復(fù)雜的話,通過封裝在lua腳本中發(fā)送給redis,而且redis是單線程的,這樣就保證這段復(fù)雜業(yè)務(wù)邏輯執(zhí)行的原子性。

4、可重入加鎖機(jī)制

Redisson可以實(shí)現(xiàn)可重入加鎖機(jī)制的原因,我覺得跟兩點(diǎn)有關(guān):

  1.  `1、Redis存儲(chǔ)鎖的數(shù)據(jù)類型是  Hash類型`
  2.  `2、Hash數(shù)據(jù)類型的key值包含了當(dāng)前線程信息。`

下面是redis存儲(chǔ)的數(shù)據(jù)
redisson是如何解決死鎖問題的

上面這圖的意思就是可重入鎖的機(jī)制,它最大的優(yōu)點(diǎn)就是相同線程不需要在等待鎖,而是可以直接進(jìn)行相應(yīng)操作。

5、Redis分布式鎖的缺點(diǎn)

Redis分布式鎖會(huì)有個(gè)缺陷,就是在Redis哨兵模式下:

客戶端1 對(duì)某個(gè) master節(jié)點(diǎn)寫入了redisson鎖,此時(shí)會(huì)異步復(fù)制給對(duì)應(yīng)的 slave節(jié)點(diǎn)。但是這個(gè)過程中一旦發(fā)生 master節(jié)點(diǎn)宕機(jī),主備切換,slave節(jié)點(diǎn)從變?yōu)榱?master節(jié)點(diǎn)。

這時(shí) 客戶端2 來嘗試加鎖的時(shí)候,在新的master節(jié)點(diǎn)上也能加鎖,此時(shí)就會(huì)導(dǎo)致多個(gè)客戶端對(duì)同一個(gè)分布式鎖完成了加鎖。

這時(shí)系統(tǒng)在業(yè)務(wù)語(yǔ)義上一定會(huì)出現(xiàn)問題,導(dǎo)致各種臟數(shù)據(jù)的產(chǎn)生

缺陷在哨兵模式或者主從模式下,如果 master實(shí)例宕機(jī)的時(shí)候,可能導(dǎo)致多個(gè)客戶端同時(shí)完成加鎖。

感謝各位的閱讀,以上就是“redisson是如何解決死鎖問題的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)redisson是如何解決死鎖問題的這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

文章標(biāo)題:redisson是如何解決死鎖問題的
URL網(wǎng)址:http://bm7419.com/article10/jdohgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃外貿(mào)建站、域名注冊(cè)、網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)