Redis与Zookeeper实现分布式锁区别
1.分布式鎖解決方案
?1.采用數(shù)據(jù)庫 不建議 性能不好 jdbc
?2.基于Redis實(shí)現(xiàn)分布式鎖(setnx)setnx也可以存入key,如果存入key成功返回1,如果存入的key已經(jīng)存在了,返回0.
3.基于Zookeeper實(shí)現(xiàn)分布式鎖 Zookeeper是一個(gè)分布式協(xié)調(diào)工具,在分布式解決方案中。
多個(gè)客戶端(jvm),同時(shí)在zk上創(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ū)別
實(shí)現(xiàn)分布式鎖最終是通過什么方式?(相同點(diǎn))
在集群環(huán)境下,保證只允許有一個(gè)jvm進(jìn)行執(zhí)行。
從技術(shù)上分析(區(qū)別)
Redis 是nosql數(shù)據(jù),主要特點(diǎn)緩存
Zookeeper是分布式協(xié)調(diào)工具,主要用于分布式解決方案
?
實(shí)現(xiàn)思路( 區(qū)別)
核心通過獲取鎖、釋放鎖、死鎖問題
?
獲取鎖
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 是對(duì)key設(shè)置有效期解決死鎖現(xiàn)象
?
性能角度考慮
?
因?yàn)镽edis是NoSQL數(shù)據(jù)庫,相對(duì)比來說Redis比Zookeeper性能要好。
?
可靠性
?
從可靠性角度分析,Zookeeper可靠性比Redis更好。
因?yàn)镽edis有效期不是很好控制,可能會(huì)產(chǎn)生有效期延遲,Zookeeper就不一樣,因?yàn)閆ookeeper臨時(shí)節(jié)點(diǎn)先天性可控的有效期,所以相對(duì)來說Zookeeper比Redis更好
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Redis与Zookeeper实现分布式锁区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis实现分布式锁释放锁
- 下一篇: POI的入门:单元格样式处理