真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式-創(chuàng)新互聯(lián)

一、為什么要使用分布式鎖

分布式環(huán)境下修改某個(gè)共有的數(shù)據(jù),比如redis的共有數(shù)據(jù);

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),龍城企業(yè)網(wǎng)站建設(shè),龍城品牌網(wǎng)站建設(shè),網(wǎng)站定制,龍城網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,龍城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

在同一時(shí)間,可能多個(gè)節(jié)點(diǎn)都先查詢這個(gè)數(shù)據(jù),然后更新。在查詢的時(shí)候,結(jié)果是一樣的,但是各個(gè)節(jié)點(diǎn)更新的時(shí)候,就是以最后一個(gè)更新為準(zhǔn)了,這樣就會(huì)導(dǎo)致其它節(jié)點(diǎn)的更新其實(shí)是失敗的;

案例:告警設(shè)置max_step的功能就是分布式更新導(dǎo)致通知多次;

解決以上問(wèn)題最徹底的辦法(不一定是最好)是使用分布式鎖,這樣可以保證數(shù)據(jù)的一致性。但是分布式鎖很多會(huì)帶來(lái)性能的下降,所以不一定是最好的方式。

二、分布式鎖的三種實(shí)現(xiàn)方式

1、基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)分布式鎖

對(duì)字段增加唯一性約束;?

2、基于緩存(Redis等)實(shí)現(xiàn)分布式鎖

setnx()方法,這種很高效,另外也有一種比較低效的方式:查詢的時(shí)候就上鎖,如下:

try{
    lock = redisTemplate.opsForValue().setIfAbsent(lockKey, LOCK);
    logger.info("cancelCouponCode是否獲取到鎖:"+lock);
    if (lock) {
        // TODO
        redisTemplate.expire(lockKey,1, TimeUnit.MINUTES); //成功設(shè)置過(guò)期時(shí)間
        return res;
    }else {
        logger.info("cancelCouponCode沒有獲取到鎖,不執(zhí)行任務(wù)!");
    }
}finally{
    if(lock){   
        redisTemplate.delete(lockKey);
        logger.info("cancelCouponCode任務(wù)結(jié)束,釋放鎖!");       
    }else{
        logger.info("cancelCouponCode沒有獲取到鎖,無(wú)需釋放鎖!");
    }

3、基于Zookeeper實(shí)現(xiàn)分布式鎖

讓我們來(lái)回顧一下Zookeeper節(jié)點(diǎn)的概念:

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

Znode分為四種類型:

1.持久節(jié)點(diǎn) (PERSISTENT)

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

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

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

3.臨時(shí)節(jié)點(diǎn)(EPHEMERAL)

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

4.臨時(shí)順序節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL)

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

Zookeeper分布式鎖的原理

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

獲取鎖

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

釋放鎖

釋放鎖分為兩種情況:

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

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

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

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

同理,如果Client2也因?yàn)槿蝿?wù)完成或者節(jié)點(diǎn)崩潰而刪除了節(jié)點(diǎn)Lock2,那么Client3就會(huì)接到通知。

一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式

最終,Client3成功得到了鎖。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


本文標(biāo)題:一文讓你讀懂分布式鎖的使用原理及實(shí)現(xiàn)方式-創(chuàng)新互聯(lián)
文章出自:http://weahome.cn/article/dcpsgj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部