分布式鎖的基本應用場景和設計原則
分布式鎖一定要保證多客戶端競爭臨界資源時的絕對互斥;
分布式鎖要設計一定的超時時間,防止在獲得鎖的服務阻塞或者崩潰引起的鎖無法釋放;
分布式要針對業務場景設計鎖機制異常降級措施,防止因為鎖獲取錯誤導致無法獲取臨界資源的後果。
redis具體實現分布式鎖
setnx key value
獲取鎖:獲取當前的timestamp,並將客戶端id作為key,該timestamp作為value呼叫setnx,並設定鎖的ttl,處理獲取鎖的異常。
確認鎖狀態,如果成功獲取鎖,則訪問臨界資源,否則根據業務場景間隔一定時間再次嘗試獲取鎖。
訪問臨界資源
釋放鎖//獲取鎖
timestamp
=getcurrenttimestamp
();
try
catch
(exceptione)
try
else
}
finally
remain_time
=ttl
-spacetime
//獲取鎖
timestamp
=getcurrenttimestamp
();
//向n/2+1個節點申請鎖
int
successlocknum=0
;
boolean
locksuccess
=false
;
for
(inti=
1;i<5;
i++)
}catch
(exceptione)
}
//驗證獲取鎖是否成功
if
(!successlocknum
)
//驗證獲取到到鎖是否是無效鎖
nowtimestamp
=getcurrenttimestamp
();
if
(nowtimestamp
-timestamp
>
ttl)
try
finally
後續
Redis分布式鎖解析
原文 blog.csdn.net zhongguoren 產生隨機數,可用uuid,儲存起來,一般儲存在threadlocal中,以便解鎖用 呼叫redis 的setnx命令將隨機數當作value存入,key為taskid,同時設定過期時間。實際專案中過期時間的多少主要是取決任務估算的執行時間,一般...
分布式鎖實現之redis
利用redis設計分布式鎖主要用下面這三個命令 setnx setnx key val 當且僅當key不存在時,set乙個key為val的字串,返回1 若key存在,則什麼都不做,返回0。expire expire key timeout 為key設定乙個超時時間,單位為second,超過這個時間鎖...
分布式鎖之redis實現
當我併發測試時 這tm肯定不行啊,這就超賣了,明明沒這麼多商品,結果還賣出去了。首先,synchronized的確是乙個解決辦法,而且也很簡單,在方法前面加乙個synchronized關鍵字。但是通過壓測,發現請求變的很慢,因為 synchronized就用乙個鎖把這個方法鎖住了,每次訪問這個方法,...