Redis分佈式鎖原理解析

一、Redis分佈式鎖的流程圖

流程圖
首先設置上鎖的方式,用setnx(lockkey,currenttime+timout)來表示設置鎖,其中lockkey爲我們所需要爭取到的鎖,value值則由當前時間和設置的超時時間組成。
當我們爭取到鎖後,進行常規操作即可,接下來我們討論競爭鎖失敗後的優化。

二、獲取鎖的優化判斷

首先我們去得到lockkey的value值,接下來進入第一個判斷條件:
若這個值不爲空,且當前時間的值是大於這個數值的,則代表這個鎖已經超時了,並可能之前獲得鎖的操作出現了異常(比如突然關掉Tomcat),導致redis中的鎖expire值爲-1,而沒被釋放,此時代表我是可以再次獲取到鎖的。

於是接着執行getset(lockkey.currenttime + timeout),重新設置鎖的value值,此處用到getset將會返回舊值lockvalueB,是爲了進一步確保鎖的安全,比如又有其他Tomcat拿到鎖了。
接着判斷lockvalueB,
1. 若爲空,代表lockkey已經沒有了(可能是已經被釋放),所以可以正常拿到鎖;
2. 若跟lockvalueA相等,則代表在兩個菱形判斷條件過程中,沒有其他服務過來爭取鎖,而lockkey是已經處於超時的狀況,因而也可以正常去獲取鎖。
這樣加雙重判斷就能有效防止死鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章