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