最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Zookeeper實現(xiàn)分布式鎖

 更新時間:2022年10月31日 09:04:18   作者:kongmin_123  
這篇文章主要介紹了使用Zookeeper實現(xiàn)分布式鎖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

如何用Zookeeper實現(xiàn)分布式鎖?

在學(xué)習(xí)分布式鎖之前,需要首先了解一下Zookeeper的[臨時順序節(jié)點]。

什么是臨時順序節(jié)點?

讓我們來回顧一下Zookeeper節(jié)點的概念:

Zookeeper的數(shù)據(jù)存儲結(jié)構(gòu)就像一棵樹,這棵樹由節(jié)點組成,這種節(jié)點叫做Znode。

Znode分為四種類型

1.持久節(jié)點 (PERSISTENT)

默認(rèn)的節(jié)點類型。創(chuàng)建節(jié)點的客戶端與zookeeper斷開連接后,該節(jié)點依舊存在 。

2.持久節(jié)點順序節(jié)點(PERSISTENT_SEQUENTIAL)

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

3.臨時節(jié)點(EPHEMERAL) 

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

4.臨時順序節(jié)點(EPHEMERAL_SEQUENTIAL) 

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

那臨時順序節(jié)點和Zookeeper的分布式鎖有什么關(guān)系呢?

Zookeeper分布式鎖的原理

Zookeeper分布式鎖恰恰應(yīng)用了臨時順序節(jié)點。具體如何實現(xiàn)呢?讓我們來看一看詳細(xì)步驟:

獲取鎖

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

之后,Client1查找ParentLock下面所有的臨時順序節(jié)點并排序,判斷自己所創(chuàng)建的節(jié)點Lock1是不是順序最靠前的一個。如果是第一個節(jié)點,則成功獲得鎖。 

這時候,如果再有一個客戶端 Client2 前來獲取鎖,則在ParentLock下載再創(chuàng)建一個臨時順序節(jié)點Lock2。 

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

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

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

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

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

這樣一來,Client1得到了鎖,Client2監(jiān)聽了Lock1,Client3監(jiān)聽了Lock2。這恰恰形成了一個等待隊列,很像是Java當(dāng)中ReentrantLock所依賴的AQS(AbstractQueuedSynchronizer)。

獲得鎖的過程大致就是這樣,那么Zookeeper如何釋放鎖呢?

釋放鎖的過程很簡單,只需要釋放對應(yīng)的子節(jié)點就好。

釋放鎖

釋放鎖分為兩種情況:

1.任務(wù)完成,客戶端顯示釋放

當(dāng)任務(wù)完成時,Client1會顯示調(diào)用刪除節(jié)點Lock1的指令。

2.任務(wù)執(zhí)行過程中,客戶端崩潰

獲得鎖的Client1在任務(wù)執(zhí)行過程中,如果Duang的一聲崩潰,則會斷開與Zookeeper服務(wù)端的鏈接。根據(jù)臨時節(jié)點的特性,相關(guān)聯(lián)的節(jié)點Lock1會隨之自動刪除。 

由于Client2一直監(jiān)聽著Lock1的存在狀態(tài),當(dāng)Lock1節(jié)點被刪除,Client2會立刻收到通知。這時候Client2會再次查詢ParentLock下面的所有節(jié)點,確認(rèn)自己創(chuàng)建的節(jié)點Lock2是不是目前最小的節(jié)點。如果是最小,則Client2順理成章獲得了鎖。 

同理,如果Client2也因為任務(wù)完成或者節(jié)點崩潰而刪除了節(jié)點Lock2,那么Client3就會接到通知。 

最終,Client3成功得到了鎖。 

使用Zookeeper實現(xiàn)分布式鎖的大致流程就是這樣。那么使用Zookeeper實現(xiàn)的分布式鎖和Redis實現(xiàn)的分布式鎖相比有什么優(yōu)勢和劣勢呢?

下面總結(jié)一下他們各自的優(yōu)劣

分布式鎖優(yōu)點缺點
Zookeeper

1.有封裝好的框架,容易實現(xiàn)

2.有等待鎖的隊列,大大提升搶鎖效率。

添加和刪除節(jié)點性能較低
RedisSet和Del指令性能較高

1.實現(xiàn)復(fù)雜,需要考慮超時,原子性,誤刪等情形。

2.沒有等待鎖的隊列,只能在客戶端自旋來等待,效率低下。

有人說Zookeeper實現(xiàn)的分布式鎖支持可重入,Redis實現(xiàn)的分布式鎖不支持可重入,這是錯誤的觀點。兩者都可以在客戶端實現(xiàn)可重入邏輯。

關(guān)于Zookeeper分布式鎖的內(nèi)容就介紹到這里啦。 

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何在Redis中實現(xiàn)分頁排序查詢過程解析

    如何在Redis中實現(xiàn)分頁排序查詢過程解析

    這篇文章主要介紹了如何在Redis中實現(xiàn)分頁排序查詢過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot整合Hutool實現(xiàn)文件上傳的使用示例

    SpringBoot整合Hutool實現(xiàn)文件上傳的使用示例

    文件上傳在項目經(jīng)常會用到,本文主要介紹了SpringBoot整合Hutool實現(xiàn)文件上傳的使用示例,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Java線程實現(xiàn)的兩種方式解析

    Java線程實現(xiàn)的兩種方式解析

    這篇文章主要介紹了Java線程實現(xiàn)的兩種方式解析,注意在構(gòu)造器中啟動這個線程的話,很容易造成this逃逸的問題,這是要注意的,這是通過直接集成thread來成為線程,同時在這種情況下,你可以通過調(diào)用合適的方法來,需要的朋友可以參考下
    2024-01-01
  • IDEA使用properties配置文件進行mysql數(shù)據(jù)庫連接的教程圖解

    IDEA使用properties配置文件進行mysql數(shù)據(jù)庫連接的教程圖解

    Properties類是 鍵和值均為字符串的可以永久存儲到文件中的key-value集合。這篇文章主要介紹了IDEA使用properties配置文件進行mysql數(shù)據(jù)路連接 ,需要的朋友可以參考下
    2018-10-10
  • SpringBoot實現(xiàn)單文件與多文件上傳

    SpringBoot實現(xiàn)單文件與多文件上傳

    本次例子不基于第三方存儲(如七牛云對象存儲、阿里云對象存儲、騰訊云對象存儲等),僅基于本地存儲。本文主要內(nèi)容如下:公共文件存儲代碼;單文件上傳代碼;多文件上傳代碼
    2021-05-05
  • Java GUI制作簡單的管理系統(tǒng)

    Java GUI制作簡單的管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java GUI制作簡單的管理系統(tǒng)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Spring Boot設(shè)置并使用緩存的步驟

    Spring Boot設(shè)置并使用緩存的步驟

    今天小編就為大家分享一篇關(guān)于Spring Boot設(shè)置并使用緩存的步驟,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java報錯Non-terminating?decimal?expansion解決分析

    Java報錯Non-terminating?decimal?expansion解決分析

    這篇文章主要為大家介紹了Java報錯Non-terminating?decimal?expansion解決方案及原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • IDEA入門級使用教程你居然還在用eclipse?

    IDEA入門級使用教程你居然還在用eclipse?

    上個月,idea的使用量超越eclipse的消息席卷了整個IT界,idea到底好在哪里呢?下面小編通過本文給大家詳細(xì)介紹下IDEA入門級使用教程,非常詳細(xì),感興趣的朋友一起看看吧
    2020-10-10
  • 劍指Offer之Java算法習(xí)題精講數(shù)組與列表的查找及字符串轉(zhuǎn)換

    劍指Offer之Java算法習(xí)題精講數(shù)組與列表的查找及字符串轉(zhuǎn)換

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03

最新評論

龙山县| 沧州市| 宜宾县| 台北县| 江达县| 黄陵县| 鱼台县| 晋宁县| 玛沁县| 莆田市| 灵丘县| 大同县| 泾川县| 凤台县| 邳州市| 林西县| 罗山县| 澄城县| 库伦旗| 普洱| 司法| 都兰县| 台安县| 花莲县| 沾化县| 宁南县| 若羌县| 济南市| 凤庆县| 梁河县| 逊克县| 多伦县| 尚志市| 北京市| 郯城县| 兰坪| 大邑县| 山东省| 上高县| 清涧县| 哈尔滨市|