簡單聊聊分布式鎖 Redis分布式鎖

2021-09-26 21:50:20 字數 1500 閱讀 7823

單機redis分布式鎖

單機redis分布式鎖

首先咱們先聊聊單機的redis分布式鎖

第乙個最普通的實現方式,就是在 redis 裡使用 setnx 命令建立乙個 key,這樣就算加鎖。

set resource_name my_random_value nx px 30000
執行這個命令就 ok。

釋放鎖就是刪除 key ,但是一般可以用 lua 指令碼刪除,判斷 value 一樣才刪除:

-- 刪除鎖的時候,找到 key 對應的 value,跟自己傳過去的 value 做比較,如果是一樣的才刪除。

if redis.call("get",keys[1]) == ar**[1] then

return redis.call("del",keys[1])

else

return 0

end

為啥要用 random_value 隨機值呢?因為如果某個客戶端獲取到了鎖,但是阻塞了很長時間才執行完,比如說超過了 30s,此時可能已經自動釋放鎖了,此時可能別的客戶端已經獲取到了這個鎖,要是你這個時候直接刪除 key 的話會有問題,所以得用隨機值加上面的 lua 指令碼來釋放鎖。

但是這樣是肯定不行的。因為如果是普通的 redis 單例項,那就是單點故障。或者是 redis 普通主從,那 redis 主從非同步複製,如果主節點掛了(key 就沒有了),key 還沒同步到從節點,此時從節點切換為主節點,別人就可以 set key,從而拿到鎖。

集群redis分布式鎖

集群redis分布式鎖

redlock演算法

這個場景假設有乙個redis cluster,有5個redis master例項,然後執行如下步驟獲取一把鎖:

1 獲取當前時間戳,單位是毫秒

2 跟上面類似,輪流嘗試在每個master節點上建立鎖,比如5各節點就要求是3個節點(n/2=1)

4 客戶端計算建立好鎖的時間,如果建立鎖的時間小於超時時間,就算建立成功了

5 要是鎖建立失敗了,那麼就依次刪除這個鎖

6 只要 別人建立了一把分布式鎖,你就得不斷輪詢去嘗試獲取鎖

總結:不建議用集群redis分布式鎖,因為太麻煩了,自己也上網查了很多部落格,確實很少有用這個鎖的,因為計算太麻煩。

zookeeper分布式鎖

zookeeper分布式鎖與redis分布式鎖的比較

聊完分布式鎖,咱們再聊聊分布式事務:以下為本系列部落格

1.兩階段提交方案/xa方案

2.tcc方案

3.本地訊息表

4.可靠訊息最終一致性

5.最大努力通知方案

簡單聊聊分布式鎖 zookeeper分布式鎖

zookeeper分布式鎖 zookeeper分布式鎖 舉個栗子。對某乙個資料連續發出兩個修改操作,兩台機器同時收到了請求,但是只能一台機器先執行完另外乙個機器再執行。那麼此時就可以使用 zookeeper 分布式鎖,乙個機器接收到了請求之後先獲取 zookeeper 上的一把分布式鎖,就是可以去建...

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...

Redis分布式鎖

分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...