還不懂分布式鎖碱工?看看 Redisson 是如何實現(xiàn)分布式鎖的娃承!

來源:https://www.cnblogs.com/qdhxhz/p/11046905.html
作者:雨點的名字

Redisson 實現(xiàn)分布式鎖

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

    1历筝、Redisson實現(xiàn)分布式鎖原理
    2、Redisson實現(xiàn)分布式鎖的源碼解析
    3廊谓、Redisson實現(xiàn)分布式鎖的項目代碼(可以用于實際項目中)

本文只介紹Redisson如何實現(xiàn)分布式鎖的原理漫谷。

一、高效分布式鎖

當我們在設計分布式鎖的時候蹂析,我們應該考慮分布式鎖至少要滿足的一些條件舔示,同時考慮如何高效的設計分布式鎖,這里我認為以下幾點是必須要考慮的电抚。

1惕稻、互斥

在分布式高并發(fā)的條件下,我們最需要保證蝙叛,同一時刻只能有一個線程獲得鎖俺祠,這是最基本的一點。

2借帘、防止死鎖

在分布式高并發(fā)的條件下蜘渣,比如有個線程獲得鎖的同時,還沒有來得及去釋放鎖肺然,就因為系統(tǒng)故障或者其它原因使它無法執(zhí)行釋放鎖的命令,導致其它線程都無法獲得鎖蔫缸,造成死鎖。

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

3校翔、性能

對于訪問量大的共享資源,需要考慮減少鎖等待的時間灾前,避免導致大量線程阻塞防症。

所以在鎖的設計時,需要考慮兩點哎甲。

1蔫敲、 鎖的顆粒度要盡量小
。比如你要通過鎖來減庫存烧给,那這個鎖的名稱你可以設置成是商品的ID,而不是任取名稱燕偶。這樣這個鎖只對當前商品有效,鎖的顆粒度小。

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

4伯诬、重入

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

針對以上Redisson都能很好的滿足平项,下面就來分析下它赫舒。

二悍及、Redisson原理分析

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

image

1心赶、加鎖機制

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

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

2琐簇、watch dog自動延期機制

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

在一個分布式環(huán)境下鸽嫂,假如一個線程獲得鎖后,突然服務器宕機了征讲,那么這個時候在一定時間后這個鎖會自動釋放据某,你也可以設置鎖的有效時間(不設置默認30秒),這樣的目的主要是防止死鎖的發(fā)生诗箍。

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

          //設置鎖1秒過去
            redissonLock.lock("redisson", 1);
            /**
             * 業(yè)務邏輯需要咨詢2秒
             */
            redissonLock.release("redisson");

          /**
           * 線程1 進來獲得鎖后癣籽,線程一切正常并沒有宕機,但它的業(yè)務邏輯需要執(zhí)行2秒滤祖,這就會有個問題筷狼,在 線程1 執(zhí)行1秒后,這個鎖就自動過期了匠童,
           * 那么這個時候 線程2 進來了埂材。那么就存在 線程1和線程2 同時在這段業(yè)務邏輯里執(zhí)行代碼,這當然是不合理的汤求。
           * 而且如果是這種情況俏险,那么在解鎖時系統(tǒng)會拋異常,因為解鎖和加鎖已經(jīng)不是同一線程了扬绪,具體后面代碼演示竖独。
           */

所以這個時候 看門狗 就出現(xiàn)了,它的作用就是 線程1 業(yè)務還沒有執(zhí)行完挤牛,時間就過了莹痢,線程1 還想持有鎖的話,就會啟動一個watch
dog后臺線程,不斷的延長鎖key的生存時間竞膳。

注意 正常這個看門狗線程是不啟動的航瞭,還有就是這個看門狗啟動后對整體性能也會有一定影響,所以不建議開啟看門狗顶猜。

3沧奴、為啥要用lua腳本呢?

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

4翰舌、可重入加鎖機制

Redisson可以實現(xiàn)可重入加鎖機制的原因嚣潜,我覺得跟兩點有關(guān):

    1、Redis存儲鎖的數(shù)據(jù)類型是 Hash類型
    2椅贱、Hash數(shù)據(jù)類型的key值包含了當前線程信息懂算。

下面是redis存儲的數(shù)據(jù)

image

這里表面數(shù)據(jù)類型是Hash類型,Hash類型相當于我們java的 <key,<key1,value>> 類型,這里key是指 'redisson'

它的有效期還有9秒,我們再來看里們的key1值為 078e44a3-5f95-4e24-b6aa-80684655a15a:45 它的組成是:

guid + 當前線程的ID庇麦。后面的value是就和可重入加鎖有關(guān)计技。

舉圖說明

image

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

5、Redis分布式鎖的缺點

Redis分布式鎖會有個缺陷航棱,就是在Redis哨兵模式下:

客戶端1 對某個 master節(jié)點 寫入了redisson鎖睡雇,此時會異步復制給對應的 slave節(jié)點。但是這個過程中一旦發(fā)生
master節(jié)點宕機饮醇,主備切換它抱,slave節(jié)點從變?yōu)榱?master節(jié)點。

這時 客戶端2 來嘗試加鎖的時候朴艰,在新的master節(jié)點上也能加鎖观蓄,此時就會導致多個客戶端對同一個分布式鎖完成了加鎖。

這時系統(tǒng)在業(yè)務語義上一定會出現(xiàn)問題呵晚, 導致各種臟數(shù)據(jù)的產(chǎn)生 蜘腌。

缺陷 在哨兵模式或者主從模式下,如果 master實例宕機的時候饵隙,可能導致多個客戶端同時完成加鎖撮珠。

說明 這篇博客主要是根據(jù)自己的開發(fā)經(jīng)驗,同時也在網(wǎng)上找了許多資料后整理的,如果哪里有寫的不對,希望多多指點芯急。萬分感激!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勺届,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娶耍,更是在濱河造成了極大的恐慌免姿,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榕酒,死亡現(xiàn)場離奇詭異胚膊,居然都是意外死亡,警方通過查閱死者的電腦和手機想鹰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門紊婉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辑舷,你說我怎么就攤上這事喻犁。” “怎么了何缓?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵肢础,是天一觀的道長。 經(jīng)常有香客問我碌廓,道長传轰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任氓皱,我火速辦了婚禮路召,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘波材。我一直安慰自己股淡,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布廷区。 她就那樣靜靜地躺著唯灵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隙轻。 梳的紋絲不亂的頭發(fā)上埠帕,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音玖绿,去河邊找鬼敛瓷。 笑死,一個胖子當著我的面吹牛斑匪,可吹牛的內(nèi)容都是我干的呐籽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狡蝶!你這毒婦竟也來了庶橱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤贪惹,失蹤者是張志新(化名)和其女友劉穎苏章,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奏瞬,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡枫绅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了硼端。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撑瞧。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖显蝌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情订咸,我是刑警寧澤曼尊,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站脏嚷,受9級特大地震影響骆撇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜父叙,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一神郊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趾唱,春花似錦涌乳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悠咱,卻和暖如春蒸辆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背析既。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工躬贡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眼坏。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓拂玻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纺讲,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容