連接html
以前本身在用redis來實現分佈式鎖的時候都是基於單個Redis實例,也就是說Redis自己是有單點故障的,Redis的官方文檔介紹了一種"自認爲"合理的算法,Redlock來實現分佈式Redis下的分佈式鎖。github
Martin Kleppmann寫了一篇文章分析Redlock。而後redis的做者寫了一篇反駁的文章這裏。加油。redis
雖而後面的算法是同樣的,不過這個點贊數確實服。算法
先簡單回顧一下單點的Redis鎖是怎麼實現的。bash
SET resource_name my_random_value NX PX 30000
客戶端A在Redis上設置一個特定的鍵值對,同時給一個超時時間(避免死鎖)。其餘客戶端在訪問的時候先看看這個key是否已經存在,而且值等於my_random_value
。若是已存在就等待,不然就獲取成功,執行業務代碼。resource_name
和my_random_value
是全部客戶端都知道而且共享的。服務器
if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end
對比key獲取到的對應的value是否相等,若是相等,就刪除(釋放),不然就返回失敗。架構
以前也寫過一篇文章。dom
這個缺陷其實很明顯,若是隻有一個Redis實例,這個掛了,全部依賴他的服務都掛了。顯然不太適合大型的應用。異步
爲了不單點故障,咱們給Redis作一個Master/Slave的主從架構,一個Master,一臺Slave。下面就會碰到這麼一個問題。下面是使用場景。
假設咱們有N(假設5)個Redis master實例,全部節點相互獨立,而且業務系統也是單純的調用,並無什麼其餘的相似消息重發之類的輔助系統。下面來模擬一下算法:
釋放比較簡單,直接刪除全部實例上對應的key就好。