為什么要實(shí)現(xiàn)分布式鎖溶其,原來(lái)的鎖不好用嗎骚腥?
因?yàn)槲覀儾渴鸬絾螜C(jī)的系統(tǒng)逐步演化為分布式系統(tǒng),原有的鎖機(jī)制只能保證在單機(jī)上某個(gè)資源在同一時(shí)間只有一個(gè)進(jìn)程訪問(wèn)瓶逃,而不能保證多臺(tái)機(jī)器下某個(gè)資源同一時(shí)間只有一個(gè)進(jìn)程訪問(wèn)桦沉。
單機(jī)redis分布式鎖
獲取鎖:
set test_lock 1352 NX PX 30000
釋放鎖:
get test_lock
if value == 1352:
del test_lock
redis集群分布式鎖——redlock
zookeeper分布式鎖實(shí)現(xiàn)
參考這篇文章,非常簡(jiǎn)單生動(dòng)易于理解金闽。
我自己也做了一點(diǎn)總結(jié):
首先客戶端可以在zookeeper上創(chuàng)建節(jié)點(diǎn)纯露,一共有四種節(jié)點(diǎn),分別是持久節(jié)點(diǎn)代芜、持久順序節(jié)點(diǎn)埠褪、臨時(shí)節(jié)點(diǎn)、臨時(shí)順序節(jié)點(diǎn)挤庇。持久節(jié)點(diǎn)的特性是客戶端斷開與zookeeper連接后節(jié)點(diǎn)仍存在钞速,順序節(jié)點(diǎn)的特性是會(huì)根據(jù)節(jié)點(diǎn)創(chuàng)建時(shí)間進(jìn)行排序。
分布式鎖應(yīng)用的是臨時(shí)順序節(jié)點(diǎn)嫡秕。
每一個(gè)試圖搶占鎖的線程都會(huì)在zookeeper上創(chuàng)建一個(gè)節(jié)點(diǎn)渴语,并進(jìn)行判斷當(dāng)前節(jié)點(diǎn)是否是第一個(gè)節(jié)點(diǎn),如果是則獲取鎖成功昆咽,否則獲取鎖失敗并進(jìn)入等待狀態(tài)驾凶,此時(shí)會(huì)在前一個(gè)節(jié)點(diǎn)注冊(cè)watcher來(lái)監(jiān)聽前一個(gè)節(jié)點(diǎn)是否存在,以等待時(shí)機(jī)獲取鎖掷酗。
redis和zookeeper分布式鎖的區(qū)別
分布式鎖 | 優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|---|
redis | 1.有封裝好的框架调违,容易實(shí)現(xiàn) 2.有等待鎖的隊(duì)列,大大提升搶鎖效率泻轰。 | 添加刪除節(jié)點(diǎn)效率低 |
zookeeper | set和del指令效率高 | 1.實(shí)現(xiàn)復(fù)雜技肩,需要考慮超時(shí),原子性浮声,誤刪等情形虚婿。2.沒有等待鎖的隊(duì)列,只能在客戶端自旋來(lái)等待泳挥,效率低下然痊。 |