Redis分布式鎖詳解

2021-08-07 19:32:05 字數 820 閱讀 3848

在網際網路分布式服務部署中,通常會遇到多個程序操作同乙個資源的情況,例如秒殺等,此文章主要介紹使用redis實現分布式鎖。

redis為單程序單執行緒模式,採用佇列模式將併發訪問變為序列訪問。通常使用setnx(即set not exiest)來實現鎖,以下通過循序漸進的方式引入最終實現。

方案一1. c1通過setnx獲取鎖,處理業務,c1通過del釋放鎖

問題:如果處理業務期間c1崩潰,導致死鎖

方案二1. c1通過setnx獲取鎖,鎖裡面設定為時間戳,全域性業務中有配置超時時間expire,處理業務,c1由於其他原因崩潰

2. c2,c3通過setnx獲取鎖失敗

3. 使用get獲取t1,t2,且curtime>t1(t2)+expire,超時(若未超時,則sleep,然後重新進入第2步)

4. c2,c3分別使用del刪除鎖

5. c2,c3分別使用setnx獲取鎖(若未獲取到,則sleep,然後重新進入第2步)

問題:c2,c3序列執**況下,c2獲取的鎖會被c3刪除,從而導致競態

方案三1. c1通過setnx獲取鎖,鎖裡面設定為時間戳,全域性業務中有配置超時時間expire,處理業務,c1由於其他原因崩潰

2. c2,c3通過setnx獲取鎖失敗

3. 使用get獲取t1,t2(為nil也進入判斷),且curtime>t1(t2)+expire,超時(若未超時,則sleep,然後重新進入第2步)

4. c2,c3分別使用getset,獲取到t11,t22(為nil也進入判斷),此時若t11=t1則c2獲取鎖(t22=t2則c3獲取鎖,二者只會有1個成立),執行業務。(若未獲取到的,則sleep,然後重新進入第2步)

redis實現分布式鎖詳解

解決問題 應對高併發業務場景 為什麼可以實現?首先redis是單執行緒的,這裡的單執行緒指的是網路請求模組使用了乙個執行緒 所以不需考慮併發安全性 即乙個執行緒處理所有網路請求,其他模組仍用了多個執行緒。實現原理 伺服器一的請求會先獲取到鎖,接下來如果來相同的請求,此時會返回獲取鎖失敗的狀態。直至本...

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