国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

都2022年了,出去面試連分布式鎖的源碼你都不會畫?

開發 前端
這個就是redis cluster,或者是redis master-slave架構的主從異步復制導致的redis分布式鎖的最大缺陷:在redis master實例宕機的時候,可能導致多個客戶端同時完成加鎖。

一、寫在前面

現在面試,一般都會聊聊分布式系統這塊的東西。通常面試官都會從服務框架(Spring Cloud、Dubbo)聊起,一路聊到分布式事務、分布式鎖、ZooKeeper等知識。

所以咱們這篇文章就來聊聊分布式鎖這塊知識,具體的來看看Redis分布式鎖的實現原理。

說實話,如果在公司里落地生產環境用分布式鎖的時候,一定是會用開源類庫的,比如Redis分布式鎖,一般就是用Redisson框架就好了,非常的簡便易用。

大家如果有興趣,可以去看看Redisson的官網,看看如何在項目中引入Redisson的依賴,然后基于Redis實現分布式鎖的加鎖與釋放鎖。

下面給大家看一段簡單的使用代碼片段,先直觀的感受一下:

怎么樣,上面那段代碼,是不是感覺簡單的不行!

此外,人家還支持redis單實例、redis哨兵、redis cluster、redis master-slave等各種部署架構,都可以給你完美實現。

二、Redisson實現Redis分布式鎖的底層原理

好的,接下來就通過一張手繪圖,給大家說說Redisson這個開源框架對Redis分布式鎖的實現原理。

(1)加鎖機制

咱們來看上面那張圖,現在某個客戶端要加鎖。如果該客戶端面對的是一個redis cluster集群,他首先會根據hash節點選擇一臺機器。

這里注意,僅僅只是選擇一臺機器!這點很關鍵!

緊接著,就會發送一段lua腳本到redis上,那段lua腳本如下所示:

為啥要用lua腳本呢?

因為一大坨復雜的業務邏輯,可以通過封裝在lua腳本中發送給redis,保證這段復雜業務邏輯執行的原子性。

那么,這段lua腳本是什么意思呢?

KEYS[1] 代表的是你加鎖的那個key,比如說:

RLock lock = redisson.getLock("myLock");

這里你自己設置了加鎖的那個鎖key就是“myLock”。

ARGV[1] 代表的就是鎖key的默認生存時間,默認30秒。

ARGV[2] 代表的是加鎖的客戶端的ID,類似于下面這樣:

8743c9c0-0795-4907-87fd-6c719a6b4586:1

給大家解釋一下,第一段if判斷語句,就是用“exists myLock”命令判斷一下,如果你要加鎖的那個鎖key不存在的話,你就進行加鎖。

如何加鎖呢?很簡單,用下面的命令:

hset myLock

8743c9c0-0795-4907-87fd-6c719a6b4586:1 1

通過這個命令設置一個hash數據結構,這行命令執行后,會出現一個類似下面的數據結構:

上述就代表“8743c9c0-0795-4907-87fd-6c719a6b4586:1”這個客戶端對“myLock”這個鎖key完成了加鎖。

接著會執行“pexpire myLock 30000”命令,設置myLock這個鎖key的生存時間是30秒。

好了,到此為止,ok,加鎖完成了。

(2)鎖互斥機制

那么在這個時候,如果客戶端2來嘗試加鎖,執行了同樣的一段lua腳本,會咋樣呢?

很簡單,第一個if判斷會執行“exists myLock”,發現myLock這個鎖key已經存在了。

接著第二個if判斷,判斷一下,myLock鎖key的hash數據結構中,是否包含客戶端2的ID,但是明顯不是的,因為那里包含的是客戶端1的ID。

所以,客戶端2會獲取到pttl myLock返回的一個數字,這個數字代表了myLock這個鎖key的剩余生存時間。比如還剩15000毫秒的生存時間。

此時客戶端2會進入一個while循環,不停的嘗試加鎖。

(3)watch dog自動延期機制

客戶端1加鎖的鎖key默認生存時間才30秒,如果超過了30秒,客戶端1還想一直持有這把鎖,怎么辦呢?

簡單!只要客戶端1一旦加鎖成功,就會啟動一個watch dog看門狗,他是一個后臺線程,會每隔10秒檢查一下,如果客戶端1還持有鎖key,那么就會不斷的延長鎖key的生存時間。

(4)可重入加鎖機制

那如果客戶端1都已經持有了這把鎖了,結果可重入的加鎖會怎么樣呢?

比如下面這種代碼:

這時我們來分析一下上面那段lua腳本。

第一個if判斷肯定不成立,“exists myLock”會顯示鎖key已經存在了。

第二個if判斷會成立,因為myLock的hash數據結構中包含的那個ID,就是客戶端1的那個ID,也就是“8743c9c0-0795-4907-87fd-6c719a6b4586:1”

此時就會執行可重入加鎖的邏輯,他會用:

incrby myLock

8743c9c0-0795-4907-87fd-6c71a6b4586:1 1

通過這個命令,對客戶端1的加鎖次數,累加1。

此時myLock數據結構變為下面這樣:

大家看到了吧,那個myLock的hash數據結構中的那個客戶端ID,就對應著加鎖的次數

(5)釋放鎖機制

如果執行lock.unlock(),就可以釋放分布式鎖,此時的業務邏輯也是非常簡單的。

其實說白了,就是每次都對myLock數據結構中的那個加鎖次數減1。

如果發現加鎖次數是0了,說明這個客戶端已經不再持有鎖了,此時就會用:

“del myLock”命令,從redis里刪除這個key。

然后呢,另外的客戶端2就可以嘗試完成加鎖了。

這就是所謂的分布式鎖的開源Redisson框架的實現機制。

一般我們在生產系統中,可以用Redisson框架提供的這個類庫來基于redis進行分布式鎖的加鎖與釋放鎖。

(6)上述Redis分布式鎖的缺點

其實上面那種方案最大的問題,就是如果你對某個redis master實例,寫入了myLock這種鎖key的value,此時會異步復制給對應的master slave實例。

但是這個過程中一旦發生redis master宕機,主備切換,redis slave變為了redis master。

接著就會導致,客戶端2來嘗試加鎖的時候,在新的redis master上完成了加鎖,而客戶端1也以為自己成功加了鎖。

此時就會導致多個客戶端對一個分布式鎖完成了加鎖。

這時系統在業務語義上一定會出現問題,導致各種臟數據的產生。

所以這個就是redis cluster,或者是redis master-slave架構的主從異步復制導致的redis分布式鎖的最大缺陷:在redis master實例宕機的時候,可能導致多個客戶端同時完成加鎖。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2019-10-29 09:41:54

Kafka分布式

2015-03-16 11:33:16

程序員代碼bug

2021-07-16 07:57:34

ZooKeeperCurator源碼

2023-05-16 07:15:11

架構模型對象

2022-07-06 08:01:05

數據庫分布式

2021-07-06 08:37:29

Redisson分布式

2019-06-19 15:40:06

分布式鎖RedisJava

2021-06-30 14:56:12

Redisson分布式公平鎖

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2021-02-02 16:37:25

Redis分布式

2020-04-10 08:03:04

分布式鎖Redlock算法流行算法

2020-09-27 06:50:56

Java互聯網注解

2021-07-01 09:42:08

Redisson分布式

2022-03-27 22:07:35

元宇宙虛擬人IBM

2024-01-09 08:20:05

2021-07-08 09:21:17

ZooKeeper分布式鎖 Curator

2017-10-24 11:28:23

Zookeeper分布式鎖架構

2021-06-27 21:24:55

RedissonJava數據

2024-11-28 15:11:28

2021-07-07 07:09:49

Redisson分布式鎖源碼
點贊
收藏

51CTO技術棧公眾號

香蕉视频一区| 日本美女高潮视频| 青青青国产精品| 亚洲一级电影视频| 91久久久久久久久久久| 熟女熟妇伦久久影院毛片一区二区| 麻豆电影在线| 欧美刺激性大交免费视频| 色涩成人影视在线播放| 日本在线丨区| 黄色欧美网站| 亚洲色图视频网站| 亚洲一区二区中文字幕| 99re6在线精品视频免费播放| 国产麻豆视频精品| 国产成人一区二区三区电影| 国产中文字幕在线播放| 久久av最新网址| 日韩高清免费在线| 国产黄页在线观看| 青草国产精品| 亚洲成人av一区二区三区| 国产精品福利网站| 日本不卡电影| 欧美在线www| 国产黄在线播放| 欧美激情自拍| av毛片久久久久**hd| 老司机av福利| 麻豆精品在线视频| 欧美日韩国产影片| 成人精品一二区| 欧美两根一起进3p做受视频| 日中文字幕在线| 欧美一级本道电影免费专区| 日韩一区二区三区在线观看| 日韩网址在线观看| av综合网站| 欧美日韩中国免费专区在线看| 日本在线高清视频一区| 成人av在线播放| 91精品国产入口| 可以在线观看的av| 国产精品婷婷午夜在线观看| 久久免费一级片| 日韩中文字幕91| 日韩黄色影视| 日日夜夜精品免费视频| 97超碰人人模人人爽人人看| 亚洲永久精品唐人导航网址| 成人444kkkk在线观看| 在线免费日韩片| 日韩一本二本av| 久久视频www| 国产精品亲子伦对白| 日本在线视频一区| 99久久99久久精品国产片桃花 | 亚洲高清影院| 日韩丝袜美女视频| 在线视频三级| 亚洲久草在线视频| 成年人免费在线视频| 欧美啪啪网站| 一道本无吗dⅴd在线播放一区| 男人av在线播放| 亚洲精品自拍偷拍| 精品国产亚洲一区二区三区| 两个人的视频www国产精品| 色8久久久久| 国内精品一区二区三区四区| 国产日韩精品在线看| 欧美自拍视频在线| 99热在这里有精品免费| 丰满少妇在线观看| 欧美性生活久久| 亚州av中文字幕在线免费观看| 色哟哟日韩精品| 麻豆视频在线观看免费网站| 精品日韩成人av| 亚洲wwwww| 亚洲国产婷婷香蕉久久久久久| 欧美精品高清| 亚洲性69xxxbbb| 超碰在线免费看| 国产精品www| 亚洲国产日本| 日本成人一区| 国产精品对白刺激久久久| 国产成人在线观看| 99视频在线播放| 日韩一区中文字幕| 国产精品久久久久久久免费观看| 国产三级在线| 亚洲国产精品视频一区| 92精品国产成人观看免费| 欧美一区二区视频| 92国产精品观看| 亚洲1区在线观看| 国产免费av高清在线| 日韩精品久久久毛片一区二区| 日韩亚洲国产欧美| 中文字幕在线免费观看视频| 天天干天天干天天干天天干天天干| 欧美一级电影免费在线观看| 国产日产欧美一区二区视频| 精品美女视频在线观看免费软件| 久久久亚洲天堂| 久久精品国产77777蜜臀| 亚洲欧美一区二区三区| 97成人精品视频在线观看| 粉嫩精品导航导航| 国产精品一区二区三区免费观看| 一区二区在线观看不卡| 伊人精品综合| 国产高清不卡无码视频| 色一情一伦一子一伦一区| 午夜av成人| 精品不卡在线| 亚洲一区二区黄| 欧美视频中文字幕在线| 国产日韩精品视频一区| 粉嫩欧美一区二区三区| 欧美 日本 亚洲| 久久精品视频99| 亚洲成国产人片在线观看| 日韩精品一级| 999精彩视频| zzjj国产精品一区二区| 国产精品电影一区二区| 中文在线播放一区二区| 久草视频在线播放| 91在线视频一区| 色女孩综合影院| 免费永久网站黄欧美| 免费h视频在线观看| 亚洲 欧美 日韩 国产综合 在线 | 成人看的羞羞网站| 伊甸园精品99久久久久久| 制服丝袜在线91| 狠色狠色综合久久| 亲子伦视频一区二区三区| 国产亚洲精品网站| 久草免费福利在线| 国产精品久久久久久五月尺 | 国产精品美女久久久浪潮软件| 久久久加勒比| 国产在线999| 欧美日韩精品欧美日韩精品一综合| 日韩欧美字幕| 日韩精品一区二区三区中文字幕| 午夜精品一区二区三区四区 | 中文字幕在线看视频国产欧美在线看完整 | 成人av免费网站| 亚洲日本va| 最新黄色片网站| 亚洲精品国产精品国自产观看| 尤物九九久久国产精品的分类| 国产精品入口麻豆原神| 欧美1区视频| 亚洲老司机网| 最新av网站在线观看| 国产xxxxx视频| 亚洲韩国在线| 久久成年人视频| 精品不卡在线视频| 亚洲一区二区三区国产| 日韩精品一区二区三区视频播放| 国产精品久久久久久久午夜| 伊人精品在线观看| 国产91在线播放精品91| 美女999久久久精品视频| 午夜精彩视频在线观看不卡| 色婷婷av一区二区三区软件| 日韩欧美中文一区二区| www视频在线观看| 国产97免费视| 蜜桃91精品入口| 邻居大乳一区二区三区| 亚洲综合图区| 福利电影一区| 亚洲天堂av资源在线观看| 成人做爰免费视频免费看| 成人影院中文字幕| 亚欧无线一线二线三线区别| 中文字幕资源网在线观看| 黄色一级片在线观看| 成人免费淫片视频软件| 92国产精品观看| 国产69精品一区二区亚洲孕妇| 91视频婷婷| 久久精品中文字幕电影| 欧美亚洲激情视频| 亚洲高清在线播放| 欧美污视频网站| 精品不卡一区二区三区| 亚洲精品国产精品国自产| 91九色porny在线| 超级白嫩亚洲国产第一| 亚洲精品进入| 成人黄色大片在线观看 |