redis分布式鎖處理併發問題

2021-08-22 07:09:56 字數 989 閱讀 7790

redis鎖處理高併發問題十分常見,使用的時候常見有幾種錯誤,和對應的解決辦法,在此進行自己的總結和整理。

set方式

作為redis小白,一開始能想到的使用redis加鎖的方式就是set。 

加鎖:redis中set乙個值,set(lock,1); 

併發處理:其他執行緒必須拿到這個值,才可以往下進行,否則等待。

while(jedis.exists(lock))

set(lock,1);

執行業務**;

jedis.del(lock);

釋放鎖:執行完業務**之後,釋放redis鎖,jedis.del(lock) 

防止死鎖:set(lock,1) —>3秒後未釋放,則自動釋放setex(lock, 3, 1) 

問題:高併發情況下,程序同時獲取鎖狀態為null,同時設定,鎖之間相互覆蓋,但是倆程序仍在併發執行業務**。 

setnx方式

後來發現有setnx的原子操作命令,鎖存在不能設定值,返回0;鎖不存在,則設定鎖,返回1; 

加鎖:jedis.setnx(lock, 1) 

併發處理:

while(jedis.setnx(lock,1)==0)

執行業務**;

jedis.del(lock);

釋放鎖:執行完業務**之後,釋放redis鎖,jedis.del(lock) 

問題:當程序執行出現問題,鎖未釋放,則其他程序永遠處於阻塞狀態,出現死鎖。 

防止死鎖:加鎖時帶上時間戳,setnx(lock, 時間戳+超時時間)

while(jedis.setnx(lock,now+超時時間)==0)else

}執行業務**;

jedis.del(lock);

Redis高併發分布式鎖詳解

乙個可靠的分布式鎖應該具備以下特性 互斥性 作為鎖,需要保證任何時刻只能有乙個客戶端 使用者 持有鎖 可重入 同乙個客戶端在獲得鎖後,可以再次進行加鎖 高可用 獲取鎖和釋放鎖的效率較高,不會出現單點故障 自動重試機制 當客戶端加鎖失敗時,能夠提供一種機制讓客戶端自動重試 加了synchronized...

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