解析分布式鎖之redis實現

2021-08-17 17:41:21 字數 1556 閱讀 3377

分布式鎖的基本應用場景和設計原則

分布式鎖一定要保證多客戶端競爭臨界資源時的絕對互斥;

分布式鎖要設計一定的超時時間,防止在獲得鎖的服務阻塞或者崩潰引起的鎖無法釋放;

分布式要針對業務場景設計鎖機制異常降級措施,防止因為鎖獲取錯誤導致無法獲取臨界資源的後果。

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就用乙個鎖把這個方法鎖住了,每次訪問這個方法,...