基于redis和zookeeper的分布式鎖實現(xiàn)方式

先來說說什么是分布式鎖痘系,簡單來說,分布式鎖就是在分布式并發(fā)場景中,能夠?qū)崿F(xiàn)多節(jié)點的代碼同步的一種機制谋梭。從實現(xiàn)角度來看,主要有兩種方式:基于redis的方式和基于zookeeper的方式倦青,下面分別簡單介紹下這兩種方式:

一瓮床、基于redis的分布式鎖實現(xiàn)

歡迎工作一到五年的Java工程師朋友們加入Java架構工程師:611481448

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之后還會有職業(yè)生涯規(guī)劃以及面試指導

1.獲取鎖

redis是一種key-value形式的NOSQL數(shù)據(jù)庫,常用于作服務器的緩存姨夹。從redis v2.6.12開始纤垂,set命令開始變成如下格式:

SET key value [EX seconds] [PX milliseconds] [NX|XX]

除key和value外,EX是超時時間磷账,NX表示只有在key不存在的時候才會設置key的值峭沦,而XX表示在key存在的時間才會設置key的值。NX機制就是基于redis分布式鎖的核心逃糟。能夠解決以下問題:

1)節(jié)點1獲取key吼鱼,并且設置超時時間后,還沒來得及釋放就掛掉了——這里EX超時時間會發(fā)揮作用绰咽,超時后自動釋放鎖菇肃。

2)剛獲取到鎖,還沒來得及設置超時時間就掛了——這里設置key和設置超時時間是原子操作取募,如果出現(xiàn)這種情況琐谤,會返回0,即獲取不到鎖玩敏。

2.釋放鎖

為了解決非原子操作帶來的問題斗忌,常采用lua腳本實現(xiàn)。lua腳本的操作會被認為是原子性的旺聚,類似于事務织阳。偽代碼如下:

二、基于zookeeper的分布式鎖實現(xiàn)

zookeeper是一種分布式協(xié)調(diào)服務砰粹,其中每個節(jié)點稱為znode唧躲,并有自己獨立的路徑。 znode有四種類型:

持久節(jié)點:默認的節(jié)點類型。創(chuàng)建節(jié)點的客戶端與zookeeper斷開連接后弄痹,該節(jié)點依舊存在 饭入。

持久節(jié)點順序節(jié)點:所謂順序節(jié)點,就是在創(chuàng)建節(jié)點時肛真,Zookeeper根據(jù)創(chuàng)建的時間順序給該節(jié)點名稱進行編號:

臨時節(jié)點:和持久節(jié)點相反圣拄,當創(chuàng)建節(jié)點的客戶端與zookeeper斷開連接后,臨時節(jié)點會被刪除:

臨時順序節(jié)點:結合和臨時節(jié)點和順序節(jié)點的特點:在創(chuàng)建節(jié)點時毁欣,Zookeeper根據(jù)創(chuàng)建的時間順序給該節(jié)點名稱進行編號;當創(chuàng)建節(jié)點的客戶端與zookeeper斷開連接后,臨時節(jié)點會被刪除岳掐。

下面看看是怎樣基于上面的四類節(jié)點實現(xiàn)分布式鎖的凭疮。

1.獲取鎖

1)在Zookeeper當中創(chuàng)建一個持久節(jié),當?shù)谝粋€客戶端Client1想要獲得鎖時,需要在這個節(jié)點下面創(chuàng)建一個臨時順序節(jié)點。

2)Client1查找持久節(jié)點下面所有的臨時順序節(jié)點并排序串述,判斷自己所創(chuàng)建的節(jié)點是不是順序最靠前的一個执解。如果是第一個節(jié)點,則成功獲得鎖纲酗。

3)如果再有一個客戶端 Client2 前來獲取鎖衰腌,則在持久節(jié)點下面再創(chuàng)建一個臨時順序節(jié)點Lock2。

4)Client2查找持久節(jié)點下面所有的臨時順序節(jié)點并排序觅赊,判斷自己所創(chuàng)建的節(jié)點Lock2是不是順序最靠前的一個右蕊,結果發(fā)現(xiàn)節(jié)點Lock2并不是最小的。

于是吮螺,Client2向排序僅比它靠前的節(jié)點Lock1注冊Watcher饶囚,用于監(jiān)聽Lock1節(jié)點是否存在。這意味著Client2搶鎖失敗鸠补,進入了等待狀態(tài)萝风。

5)如果又有一個客戶端Client3前來獲取鎖,則在持久節(jié)點下載再創(chuàng)建一個臨時順序節(jié)點Lock3紫岩。

Client3查找持久節(jié)點下面所有的臨時順序節(jié)點并排序规惰,判斷自己所創(chuàng)建的節(jié)點Lock3是不是順序最靠前的一個,結果同樣發(fā)現(xiàn)節(jié)點Lock3并不是最小的泉蝌。

于是歇万,Client3向排序僅比它靠前的節(jié)點Lock2注冊Watcher,用于監(jiān)聽Lock2節(jié)點是否存在梨与。這意味著Client3同樣搶鎖失敗堕花,進入了等待狀態(tài)。

2.釋放鎖

釋放鎖就比較簡單了粥鞋,因為前面創(chuàng)建的臨時順序節(jié)點缘挽,所以在出現(xiàn)下面兩種情況時,都會自動釋放鎖:

1)任務完成后,Client會釋放鎖壕曼。

2)任務沒完成苏研,Client就崩潰了,也會自動釋放鎖腮郊。

喜歡小編輕輕點個關注吧摹蘑!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市轧飞,隨后出現(xiàn)的幾起案子衅鹿,更是在濱河造成了極大的恐慌,老刑警劉巖过咬,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件大渤,死亡現(xiàn)場離奇詭異,居然都是意外死亡掸绞,警方通過查閱死者的電腦和手機泵三,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衔掸,“玉大人烫幕,你說我怎么就攤上這事〕ㄓ常” “怎么了较曼?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驱显。 經(jīng)常有香客問我诗芜,道長,這世上最難降的妖魔是什么埃疫? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任伏恐,我火速辦了婚禮,結果婚禮上栓霜,老公的妹妹穿的比我還像新娘翠桦。我一直安慰自己,他們只是感情好胳蛮,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布销凑。 她就那樣靜靜地躺著,像睡著了一般仅炊。 火紅的嫁衣襯著肌膚如雪斗幼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天抚垄,我揣著相機與錄音蜕窿,去河邊找鬼谋逻。 笑死,一個胖子當著我的面吹牛桐经,可吹牛的內(nèi)容都是我干的毁兆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼阴挣,長吁一口氣:“原來是場噩夢啊……” “哼气堕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畔咧,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤茎芭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后誓沸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骗爆,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年蔽介,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煮寡。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡虹蓄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幸撕,到底是詐尸還是另有隱情薇组,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布坐儿,位于F島的核電站律胀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏貌矿。R本人自食惡果不足惜炭菌,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逛漫。 院中可真熱鬧黑低,春花似錦、人聲如沸酌毡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枷踏。三九已至菩暗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旭蠕,已是汗流浹背停团。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工旷坦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人客蹋。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓塞蹭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讶坯。 傳聞我的和親對象是個殘疾皇子番电,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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