**
前言:
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括和順網(wǎng)站建設(shè)、和順網(wǎng)站制作、和順網(wǎng)頁制作以及和順網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,和順網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到和順省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
在學(xué)習(xí)過程中,簡單的整理了一些redis跟zookeeper實(shí)現(xiàn)分布式鎖的區(qū)別,有需要改正跟補(bǔ)充的地方,希望各位大佬及時(shí)指出
**
Redis實(shí)現(xiàn)分布式鎖思路
基于Redis實(shí)現(xiàn)分布式鎖(setnx)setnx也可以存入key,如果存入key成功返回1,如果存入的key已經(jīng)存在了,返回0.
Zookeeper實(shí)現(xiàn)分布式鎖思路
基于Zookeeper實(shí)現(xiàn)分布式鎖 Zookeeper是一個(gè)分布式協(xié)調(diào)工具,在分布式解決方案中。
多個(gè)客戶端(jvm),同時(shí)在zookeeper上創(chuàng)建相同的一個(gè)臨時(shí)節(jié)點(diǎn),因?yàn)榕R時(shí)節(jié)點(diǎn)路徑是保證唯一,只要誰能夠創(chuàng)建節(jié)點(diǎn)成功,誰就能夠獲取到鎖,沒有創(chuàng)建成功節(jié)點(diǎn),就會(huì)進(jìn)行等待,當(dāng)釋放鎖的時(shí)候,采用事件通知給客戶端重新獲取鎖的資源。
Redis實(shí)現(xiàn)分布式鎖與Zookeeper實(shí)現(xiàn)分布式鎖區(qū)別
相同點(diǎn)
實(shí)現(xiàn)分布式鎖最終是通過什么方式?
在集群環(huán)境下,保證只允許有一個(gè)jvm進(jìn)行執(zhí)行。
不同點(diǎn)
從技術(shù)上分析
Redis 是NOSQL數(shù)據(jù),主要特點(diǎn)緩存;
Zookeeper是分布式協(xié)調(diào)工具,主要用于分布式解決方案。
實(shí)現(xiàn)思路
核心通過獲取鎖、釋放鎖、死鎖問題
獲取鎖
Zookeeper
多個(gè)客戶端(jvm),會(huì)在Zookeeper上創(chuàng)建同一個(gè)臨時(shí)節(jié)點(diǎn),因?yàn)閆ookeeper節(jié)點(diǎn)命名路徑保證唯一,不允許出現(xiàn)重復(fù),只要誰能夠先創(chuàng)建成功,誰能夠獲取到鎖。
Redis
多個(gè)客戶端(jvm),會(huì)在Redis使用setnx命令創(chuàng)建相同的一個(gè)key,因?yàn)镽edis的key保證唯一,不允許出現(xiàn)重復(fù),只要誰能夠先創(chuàng)建成功,誰能夠獲取到鎖。
釋放鎖
Zookeeper使用直接關(guān)閉臨時(shí)節(jié)點(diǎn)session會(huì)話連接,因?yàn)榕R時(shí)節(jié)點(diǎn)生命周期與session會(huì)話綁定在一塊,如果session會(huì)話連接關(guān)閉的話,該臨時(shí)節(jié)點(diǎn)也會(huì)被刪除。
這時(shí)候客戶端使用事件監(jiān)聽,如果該臨時(shí)節(jié)點(diǎn)被刪除的話,重新進(jìn)入盜獲取鎖的步驟。
Redis在釋放鎖的時(shí)候,為了確保是鎖的一致性問題,在刪除的redis 的key時(shí)候,需要判斷同一個(gè)鎖的id,才可以刪除。
共同特征:如何解決死鎖現(xiàn)象問題
Zookeeper使用會(huì)話有效期方式解決死鎖現(xiàn)象。
Redis 是對key設(shè)置有效期解決死鎖現(xiàn)象
性能角度考慮
因?yàn)镽edis是NoSql數(shù)據(jù)庫,相對比來說Redis比Zookeeper性能要好。
可靠性
從可靠性角度分析,Zookeeper可靠性比Redis更好。
因?yàn)镽edis有效期不是很好控制,可能會(huì)產(chǎn)生有效期延遲;
Zookeeper就不一樣,因?yàn)閆ookeeper臨時(shí)節(jié)點(diǎn)先天性可控的有效期,所以相對來說Zookeeper比Redis更好
總結(jié)下兩者區(qū)別
Redis分布式鎖,必須使用者自己間隔時(shí)間輪詢?nèi)L試加鎖,當(dāng)鎖被釋放后,存在多線程去爭搶鎖,并且可能每次間隔時(shí)間去嘗試鎖的時(shí)候,都不成功,對性能浪費(fèi)很大。
Zookeeper分布鎖,首先創(chuàng)建加鎖標(biāo)志文件,如果需要等待其他鎖,則添加監(jiān)聽后等待通知或者超時(shí),當(dāng)有鎖釋放,無須爭搶,按照節(jié)點(diǎn)順序,依次通知使用者。