Redis分布式锁的实现原理
目前基于Redis實現的分布式鎖常用的框架是Redisson,它的使用比較簡單,在項目中引入Redisson的依賴,然后基于Redis實現分布式鎖的加鎖與釋放鎖。
Redis分布式鎖的底層原理
? Redisson這個框架對Redis分布式鎖的實現原理圖如下:
加鎖機制
? 某個客戶端要加鎖。如果該客戶端面對的是一個Redis Cluster集群,它首先會根據hash節(jié)點選擇一臺機器,這里注意,僅僅只是選擇一臺機器。緊接著就會發(fā)送一段lua腳本到redis上,lua腳本如下所示:
鎖互斥機制
? 如果這個時候客戶端B來嘗試加鎖,執(zhí)行了同樣的一段lua腳本。第一個if判斷會執(zhí)行“exists myLock”,發(fā)現myLock這個鎖key已經存在。接著第二個if判斷,判斷myLock鎖key的hash數據結構中,是否包含客戶端B的ID,但明顯沒有,那么客戶端B會獲取到pttl myLock返回的一個數字,代表myLock這個鎖key的剩余生存時間。此時客戶端B會進入一個while循環(huán),不聽的嘗試加鎖。
watch dog自動延期機制
? 客戶端A加鎖的鎖key默認生存時間只有30秒,如果超過了30秒,客戶端A還想一直持有這把鎖,怎么辦?其實只要客戶端A一旦加鎖成功,就會啟動一個watch dog看門狗,它是一個后臺線程,會每隔10秒檢查一下,如果客戶端A還持有鎖key,那么就會不斷的延長鎖key的生存時間。
可重入加鎖機制
釋放鎖機制
? 執(zhí)行l(wèi)ock.unlock(),就可以釋放分布式鎖。釋放邏輯是:每次對myLock數據結構中的那個加鎖次數減1,如果加鎖次數為0了,說明客戶端已經不再持有鎖了,此時就會用“del MyLock”命令,從redis里刪除了這個key。然后另外的客戶端B就可以嘗試完成加鎖了。
上述Redis分布式鎖的缺點
? 上面方案的最大問題,就是如果你對某個redis master實例,寫入了myLock這種鎖key的value,此時會異步復制給對應的master slave實例,但是這個過程中如果發(fā)送redis master宕機,主備切換,redis slave變?yōu)榱藃edis master。
?這就會導致客戶端B來嘗試加鎖的時候,在新的redis master上完成了加鎖,而客戶端A也以為自己成功加了鎖,此時就會導致多個客戶端對一個分布式鎖完成了加鎖。這時就會導致各種臟數據的產生。
? 所以這個就是redis cluster,或者是redis master-slave架構的主從異步復制導致的redis分布式鎖的最大缺陷:在redis master實例宕機的時候,可能導致多個客戶端同時完成加鎖。
?
總結
以上是生活随笔為你收集整理的Redis分布式锁的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单例模式的5种实现方法及优缺点
- 下一篇: 深入理解数据库行锁与表锁