分布式鎖的預研

2021-09-26 09:35:32 字數 672 閱讀 9486

互斥性

在任意時刻,只有乙個客戶端能持有鎖

不會發生死鎖

即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證後續其他客戶端能加鎖。

具有容錯性

只要大部分的redis節點正常執行,客戶端就可以加鎖和解鎖。

解鈴還須繫鈴人

加鎖和解鎖必須是同乙個客戶端,客戶端自己不能把別人加的鎖給解了。

在redis裡建立乙個key算加鎖

參考:問題

如果是普通的redis單例項,那就是單點故障。或者是redis普通主從,那redis主從非同步複製,如果主節點掛了,key還沒同步到從節點,此時從節點切換為主節點,別人就會拿到鎖。

redlock演算法

redis cluster + 實現略複雜,演算法是否正確有疑議

curator封裝了分布式鎖實現,基於臨時順序節點實現

效能上redis分布式鎖,其實需要自己不斷去嘗試獲取鎖,比較消耗效能

zk分布式鎖,獲取不到鎖,註冊個***即可,不需要不斷主動嘗試獲取鎖,效能開銷較小

如果是redis獲取鎖的那個客戶端bug了或者掛了,那麼只能等待超時時間之後才能釋放鎖;而zk的話,因為建立的是臨時znode,只要客戶端掛了,znode就沒了,此時就自動釋放鎖

zk的分布式鎖比redis的分布式鎖牢靠、而且模型簡單易用

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...

分布式專題 分布式鎖

在傳統的單體應用架構中,遇到併發安全性問題時我們可以通過同步鎖synchronized,同步 塊,reentrantlock等方式都可以解決,但隨著業務的發展,單體應用架構不能滿足龐大的使用者請求量,於是分布式系統應用而生,在分布式系統中,由於每個系統都執行在不同的伺服器上,有著不同的jvm,所以j...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...