Redis分散式鎖原理解析
阿新 • • 發佈:2019-02-07
一、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是已經處於超時的狀況,因而也可以正常去獲取鎖。
這樣加雙重判斷就能有效防止死鎖。