單機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的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...