Java架構_分布式鎖的三種實現(xiàn)

什么是分布式鎖:
有分布式鎖就有單機鎖,按照我的理解單機鎖就是服務器在一個單一節(jié)點上虎眨,當處理高并發(fā)的問題時我們可以利用可重入鎖(ReentrantLock類和synchronized),但是分布式的同步問題非常突出,不同的服務是分布在不同的節(jié)點上钦扭,也就是不同的服務器,節(jié)點和節(jié)點之前的JVM無法解決同步問題

分布式鎖的三種實現(xiàn)

基于數(shù)據(jù)庫的分布式鎖:一般有悲觀鎖和樂觀鎖的兩種實現(xiàn)機制

樂觀鎖的實現(xiàn)是這樣的(基于我比較懶就直接寫文字了):

樂觀鎖的特點是認為數(shù)據(jù)不會遭到修改床绪,也就是在操作的最后一步才會進行同步的處理客情。樂觀鎖就是在數(shù)據(jù)庫增加version的字段,操作的線程每次操作前讀取version癞己,更新數(shù)據(jù)之前再次查看version膀斋,如果一樣就更新數(shù)據(jù),否則更新失敗

想象一下不同的兩個人同時對一個賬戶進行取款操作痹雅,同時會讀取到數(shù)據(jù)中的余額仰担,version假設是1,然后其中一個操作進行了取款练慕,再次查看version還是1惰匙,然后把更新后的version+1和余額又寫入數(shù)據(jù)庫技掏,這是version為2铃将。那么另一個操作雖然一開始讀到version是1,但是當更新完數(shù)據(jù)后查看version變成2哑梳,因為這時前一操作已經更改完畢劲阎,那么這次取款就操作失敗,也就是說需要重新讀取賬戶余額鸠真。
樂觀鎖操作條件:具備遞增的version字段悯仙、每次更新前查看version是否正確龄毡,再進行更新

悲觀鎖的實現(xiàn)其實是用到了for update語句,一般用在JDBC鏈接時锡垄,當我們執(zhí)行的查詢語句最后包含for update的時候執(zhí)行此語句的線程就獲得了排它鎖沦零,我們認為這個時候此線程獲得了悲觀鎖

當我們在語句后用了for update時,多個線程執(zhí)行這條語句的情況下货岭,只有一個線程會獲取到鎖路操,其它線程被阻塞掛起,獲取鎖的線程執(zhí)行傳遞的callback 的業(yè)務邏輯千贯,執(zhí)行完畢后 執(zhí)行commit 提交事務屯仗,這意味著當前線程釋放了獲取的鎖,這時候被阻塞的線程會競爭獲取該鎖搔谴。

基于Redis的分布式鎖:setx命令

簡單說一個線程對Redis進行加鎖魁袜,原理是設置一個不存在的key和value,設置成功后返回1敦第,這時其他線程無法再次設置這個不存在的key因為此key已存在就會返回0

以下命令是Redis從2.6.12版本開始支持的:
set key value NX PX n其中set key value NX相當于以前的setnx key value峰弹,px是設置過期時間
為什么這個命令可以幫我們實現(xiàn)鎖機制呢?
因為這個命令是只有在某個key不存在的時候芜果,才會執(zhí)行成功垮卓。那么當多個進程同時并發(fā)的去設置同一個key的時候,就永遠只會有一個進程成功师幕。
當某個進程設置成功之后粟按,就可以去執(zhí)行業(yè)務邏輯了,等業(yè)務邏輯執(zhí)行完畢之后霹粥,再去進行解鎖灭将。
解鎖很簡單,只需要刪除這個key就可以了后控,不過刪除之前需要判斷庙曙,這個key對應的value是當初自己設置的那個。

基于zookeeper的分布式鎖

zookeeper提供了根節(jié)點和子節(jié)點這樣一種實現(xiàn)方式浩淘,當客戶機連接到zookeeper時捌朴,在lock/節(jié)點下創(chuàng)建子節(jié)點也就是臨時節(jié)點,并同時設置監(jiān)聽器张抄,當客戶機監(jiān)聽到自己的節(jié)點屬于最小的節(jié)點時就可以認為是獲得了鎖砂蔽,這時候可以執(zhí)行業(yè)務邏輯,執(zhí)行完畢后zookeeper刪除這個臨時節(jié)點
參考博文:
https://blog.51cto.com/13732225/2165988

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末署惯,一起剝皮案震驚了整個濱河市左驾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖诡右,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件安岂,死亡現(xiàn)場離奇詭異,居然都是意外死亡帆吻,警方通過查閱死者的電腦和手機域那,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猜煮,“玉大人琉雳,你說我怎么就攤上這事∮蚜觯” “怎么了翠肘?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辫秧。 經常有香客問我束倍,道長,這世上最難降的妖魔是什么盟戏? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任绪妹,我火速辦了婚禮,結果婚禮上柿究,老公的妹妹穿的比我還像新娘邮旷。我一直安慰自己,他們只是感情好蝇摸,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布婶肩。 她就那樣靜靜地躺著,像睡著了一般貌夕。 火紅的嫁衣襯著肌膚如雪律歼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天啡专,我揣著相機與錄音险毁,去河邊找鬼。 笑死们童,一個胖子當著我的面吹牛畔况,可吹牛的內容都是我干的。 我是一名探鬼主播慧库,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼跷跪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了完沪?” 一聲冷哼從身側響起域庇,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎覆积,沒想到半個月后听皿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宽档,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年尉姨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吗冤。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡又厉,死狀恐怖,靈堂內的尸體忽然破棺而出椎瘟,到底是詐尸還是另有隱情覆致,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布肺蔚,位于F島的核電站煌妈,受9級特大地震影響,放射性物質發(fā)生泄漏宣羊。R本人自食惡果不足惜璧诵,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仇冯。 院中可真熱鬧之宿,春花似錦、人聲如沸苛坚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泼舱。三九已至姐赡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柠掂,已是汗流浹背项滑。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涯贞,地道東北人枪狂。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像宋渔,于是被迫代替她去往敵國和親州疾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容