先來說說什么是分布式鎖痘系,簡單來說,分布式鎖就是在分布式并發(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就崩潰了,也會自動釋放鎖腮郊。
喜歡小編輕輕點個關注吧摹蘑!