Redis分布式锁原理解析
生活随笔
收集整理的這篇文章主要介紹了
Redis分布式锁原理解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這章節我們來學習一下,Redis分布式鎖的一個原理,首先我們看一下目錄,最開始我們要講一下,Redis分布式鎖,相關的一些命令,然后在分布式鎖演進的時候呢,還會以時間戳進行一個結合,后邊還會講一下,Redis分布式鎖的一個流程圖,那這個流程圖講完之后呢,我們還會講一下,Redis分布式鎖,優化版的流程圖,這一章節呢,主要大家把原理,理解透,那后續的實戰呢,我們會領著小伙伴們一起來debug,一起來分析內存,在多進程之間,調整斷點,然后是程序來覆蓋我們的分支,那首先我們來看一下,分布式鎖相關的命令
第一個就是setnx,那前邊所講的,Redis命令其實是有講的,但是我們這里要細化講一下,那nx就是not exist的一個縮寫,也就是說,只有不存在的時候,setnx才會設置成功,那setnx是具有原子性的,如果拆開來理解,那就是exist是否存在,如果不存在的話,我們再往里面set,但是如果我們執行兩個命令,他就不具有原子性了,而setnx是具有原子性的,也就是說我在set的同時,就能判斷是否已經存在,然后我們繼續看第二個,getset,從字面上理解呢,就是獲取,然后就是設置,就是getset簡單理解來說,就是先get再set,一定是先get,因為getset他的命令,作用是獲取這個值,設置新的值,他也是具有原子性的,然后是expire,設置鍵的有效期,這個比較好理解,然后是del,就是刪除,那我們課程redis,主要是通過這四個命令來實現的,那現在我們來看一下流程圖
首先我們通過setnx,存入一個lockkey,也就是鎖的名字,value使用了currenttime,加一個timeout,然后使用currenttime,和timeout來組成,這個value,currenttime就是時間戳,timeout就是這個鎖,被動釋放的一個時間,那我們在這個版本里,其實value是沒有使用的,為后面優化做一個鋪墊,這里面簡單理解就是,我就放置一個鎖,setnx,那如果獲取鎖成功呢,就會調用expire,給這個鎖呢,設置一個有效期,然后呢執行業務,下邊執行完業務,把這個key刪除掉,刪除掉這個key之后,就釋放這個鎖,也就結束了,那如果另外一個tomcat,調用這個命令的時候,返回0,就代表獲取鎖失敗,也就直接結束了,不再繼續執行,這個版本其實是有一定缺陷的,后邊的實戰呢,手把手來領著大家一起來尋找,這個缺陷,同時講解這個缺陷,一些補救辦法
我們把分布式鎖進行一個演進,那優化版的流程圖是這樣的,前邊還是一樣,setnx(lockkey,),value是時間戳,加上一個lock的timeout,那如果成功的話,這個流程和上邊的版本呢,是一樣的,釋放鎖,然后結束,那如果setnx失敗呢,我們看一下,就不直接結束了,我們會調用getlockkey,這樣我們就可以拿到,開始setnx設置的currenttime和timeout,這么一個value值,然后呢做一個判斷,我們把這個流程中get(lockkey)拿出來的value,叫做lockValueA,如果他不為空,并且當前的時間,大于lockValueA,那也就是說,setnx的時候,lockkey的timeout,其實已經超時了,我是有權利可以,獲取鎖的,如果這個條件滿足的話,那就來到true這個分支,就會調用getset方法,key都是lockkey,但是value是當前調用時候的,currenttime,再加上timeout,重新設置一個 value值,而getset方法,返回一個lockvalueB,那如果lockValueB等于空的話,代表的lockValueB其實已經沒有了,我是可以獲取到鎖的,或者lockValueA等于lockValueB,也就是說這些獲取到的,lockValueB和之前lockkey拿到的lockValueA,如果相等,那就代表著在這個過程當中,這個鎖其實是沒有變化的,那如果這個條件滿足的話,那就為true,獲取鎖成功,然后調用expire,走到可以執行業務的這么一個邏輯,那如果這個條件不滿足呢,上面還有兩個菱形,沒有判斷,那如果當前時間并不大于lockValueA呢,那就會走到false上,然后結束這次任務,下面的也是一樣的,如果這個條件不滿足,也就直接結束,第二列分布式鎖,請小伙伴們好好理解一下,然后接下來我們會在實戰中一起來coding
?
總結
以上是生活随笔為你收集整理的Redis分布式锁原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库分片前的准备
- 下一篇: 单点登录Redis存储Session及C