Zookeeper 和 Redis 哪種更好?
關(guān)于這個問題,我們 可以從 3 個方面來說:
為什么使用分布式鎖?
使用分布式鎖的目的,是為了保證同一時間只有一個 JVM 進(jìn)程可以對共享資源進(jìn)行操作。
根據(jù)鎖的用途可以細(xì)分為以下兩類:
允許多個客戶端操作共享資源,我們稱為共享鎖
這種鎖的一般是對共享資源具有冪等性操作的場景,主要是為了避免重復(fù)操作共享資源頻繁加鎖帶來的性能開銷。
只允許一個客戶端操作共享資源,我們成為排他鎖
這種鎖一般是用在對共享資源操作具有非冪等性操作的場景,也就是需要保證在同一時刻只有一個進(jìn)程或者線程能夠訪問這個共享資源。
目前實現(xiàn)分布式鎖最常用的中間件是 Redis 和 Zookeeper
第一種,Redis 可以通過兩種方式來實現(xiàn)
1. 利用 Redis 提供的
指令,這個指令是設(shè)置一個
key-value,如果 key 已經(jīng)存在,則返回 0,否則返回 1,我們基于這個返回值來判斷鎖的占用情況從而實現(xiàn)分布式鎖。
2. 基于 Redission 客戶端來實現(xiàn)分布式鎖,Redisson 提供了分布式鎖的封裝方法,我們只需要調(diào)用 api 中的 lock()和 unlock() 方法。它幫我們封裝鎖實現(xiàn)的細(xì)節(jié)和復(fù)雜度之后,每隔 10 秒幫你把 key 的超時時間設(shè)為 30s,就算一直持有鎖也不會出現(xiàn)key 過期了?!翱撮T狗”的邏輯保證了沒有死鎖發(fā)生。
第二種,基于 ZK 實現(xiàn)分布式鎖的落地方案
Zookeeper 實現(xiàn)分布式鎖的方法比較多,我們可以使用有序節(jié)點(diǎn)來實現(xiàn),
1、來看這個圖,每個線程或進(jìn)程在 Zookeeper 上的/lock 目錄下創(chuàng)建一個臨時有
序的節(jié)點(diǎn)表示去搶占鎖,所有創(chuàng)建的節(jié)點(diǎn)會按照先后順序生成一個帶有序編號的節(jié)點(diǎn)。
2、線程創(chuàng)建節(jié)點(diǎn)后,獲取/lock 節(jié)點(diǎn)下的所有子節(jié)點(diǎn),判斷當(dāng)前線程創(chuàng)建的節(jié)點(diǎn)是否是所有的節(jié)點(diǎn)的序號最小的。
3、如果當(dāng)前線程創(chuàng)建的節(jié)點(diǎn)是所有節(jié)點(diǎn)序號最小的節(jié)點(diǎn),則認(rèn)為獲取鎖成功。
4、如果當(dāng)前線程創(chuàng)建的節(jié)點(diǎn)不是所有節(jié)點(diǎn)序號最小的節(jié)點(diǎn),則對節(jié)點(diǎn)序號的前一個節(jié)點(diǎn)添加一個事件監(jiān)聽,當(dāng)前一個被監(jiān)聽的節(jié)點(diǎn)釋放鎖之后,觸發(fā)回調(diào)通知, 從而再次去嘗試搶占鎖。
兩種方案都有各自的優(yōu)缺點(diǎn)文章來源:http://www.zghlxwxcb.cn/news/detail-793620.html
對于 redis 的分布式鎖而言,它有以下缺點(diǎn):
l 它獲取鎖的方式簡單粗暴,如果獲取不到鎖,會不斷嘗試獲取鎖,比較消耗性能。
l Redis 是 AP 模型,在集群模式中由于數(shù)據(jù)的一致性會導(dǎo)致鎖出現(xiàn)問題,即便使用 Redlock 算法來實現(xiàn),在某些復(fù)雜場景下,也無法保證其實現(xiàn) 100%的可靠性。
不過在實際開發(fā)中使用 Redis 實現(xiàn)分布式鎖還是比較常見,而且大部分場情況下不會遇到”極端復(fù)雜的場景“,更重要的是 Redis 性能很高,在高并發(fā)場景中比較合適。
對于 zk 分布式鎖而言:
l zookeeper 天生設(shè)計定位就是分布式協(xié)調(diào),強(qiáng)一致性。鎖的模型健壯、簡單易用、適合做分布式鎖。
l 如果獲取不到鎖,只需要添加一個監(jiān)聽器就可以了,不用一直輪詢,性能消耗較小。
如果要在兩者之間做選擇,就我個人而言的話,比較推崇 ZK 實現(xiàn)的鎖,因為對于分布式鎖而言,它應(yīng)該符合 CP 模型,但是 Redis 是 AP 模型,所以在這個點(diǎn)上,Zookeeper 會更加合適。文章來源地址http://www.zghlxwxcb.cn/news/detail-793620.html
到了這里,關(guān)于Zookeeper 和 Redis 哪種更好? 為什么使用分布式鎖? 1. 利用 Redis 提供的 第二種,基于 ZK 實現(xiàn)分布式鎖的落地方案 對于 redis 的分布式鎖而言,它有以下缺點(diǎn):的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!