redis分佈式鎖理解

 

redis有一個命令是setIfAbsent,只要redis裏存在了這個值還會false,或者還會true。

每個線程進來時,都先判斷是否有(Boolean result = strRedisTrmplate.opsForValue().setIfAbsent("鍵","值") ),如果爲true(數據庫之前不存在這個值),就設置進去,執行業務代碼,最後刪除這個值(strRedisTrmplate。delete("鍵"))

業務代碼進行try, 刪除操作必須放在filnally裏面。避免業務代碼錯誤,不然所有線程過來都會拿到false。

但是如果系統突然宕機了,刪除操作還是沒有執行到,也會出現問題。這個時候就必須給setIfAbsent 設置過期時間, strRedisTrmplate.opsForValue().setIfAbsent("鍵","值",10,TimeUnit.SECINDS),如果業務代碼執行超過10秒,那其他線程進來可能就這個加鎖就會失效(比如第一個線程執行15秒,10秒的時候加鎖失效,第二個線程進來又加鎖成功,5秒後第一個線程把第二個的刪除了,第三個線程又進來,如此循環會造成線程會刪除不是自己線程的鎖,這個時候爲了避免刪除其他線程的鎖,會把值改成線程的唯一id,只有線程id才能刪除自己的鎖)。但是還是怕這個時間設置得不夠(業務執行時間太長),這個時候會增加一個定時器,查看當前線程是否在執行,如果還在執行,就給redis增加時間(續命)。這個就有一個插件(redisson)他就實現這些操作。

但是爲了更好保證完全沒有問題的話,最後使用zookeeper分佈鎖。

 

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