日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis分布式锁的实现原理

發(fā)布時間:2024/4/13 数据库 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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分布式锁的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。