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

Redisson 分布式鎖源碼之一:可重入鎖加鎖

開發 后端 分布式 Redis
單系統很容易想到 Java 的各種鎖,像 synchronize、ReentrantLock 等等等,那分布式系統如何處理?當然是使用分布式鎖。

[[407548]]

前言

相信小伙伴都是使用分布式服務,那一定繞不開分布式服務中數據并發更新問題!

單系統很容易想到 Java 的各種鎖,像 synchronize、ReentrantLock 等等等,那分布式系統如何處理?

當然是使用分布式鎖。

如果小伙伴不知道什么是分布式鎖,那推薦看看石杉老師的突擊課或者在網上搜一搜相關資料。

當使用 Redis 作為分布式鎖時,當前使用較多的框架就是 Redisson。

當然 Redisson 也不僅僅只能當做鎖來使用,也有很多其他的功能,小伙伴們可以看一看官方文檔,自己多動手實踐一下。

下面就開始記錄 Redisson 的相關筆記!錯誤之處,歡迎指正。

1、環境配置

  • 本地環境搭建的偽集群:

  • redisson 3.15.6

不同版本可能會有所不同,但是核心思想不會發生太大變化,如果變化很大,希望可以留言。

  1. <dependency> 
  2.     <groupId>org.redisson</groupId> 
  3.     <artifactId>redisson</artifactId> 
  4.     <version>3.15.6</version> 
  5. </dependency> 

 

  • 項目準備

一個簡單的 maven 項目,只需要一個 Main 方法即可。

2、可重入鎖加鎖

在 lock.lock() 斷點,作為源碼入口。

默認加鎖,什么參數也沒有傳遞。但是這里會設置 leaseTime = -1。這個 leaseTime 的含義是加鎖的時間。

剩下的一路挺進即可。

在調用 tryAcquire 方法之前,多了一個參數 threadId,是當前線程的 id,long 型正數。

異步加鎖

直接來到 tryAcquireAsync 異步加鎖方法。

tryAcquireAsync

前面已經說了 leaseTime 是 -1,所以這里會走到下面的方法中。

至此幾個參數已經清楚:

  1. waitTime:-1;
  2. internalLockLeaseTime:使用默認時間 30000 毫秒;
  3. TimeUnit.MILLISECONDS:單位毫秒;
  4. threadId:線程 id;
  5. RedisCommands.EVAL_LONG:eval。

Redis eval 命令的相關文檔可以閱讀:https://redis.io/commands/eval

加鎖邏輯

真正的加鎖,其實就是這么一段 lua 腳本。

先說明一下 lua 腳本的參數信息:

  1. KEYS[1]:getRawName(),加鎖的 key ,比如 anyLock;
  2. ARGV[1]:unit.toMillis(leaseTime),鎖的毫秒時間,比如 30000;
  3. ARGV[2]:getLockName(threadId),是 UUID 和線程 id 拼接起來的字符串,比如 931573de-903e-42fd-baa7-428ebb7eda80:1。

因為使用的是 lua 腳本,可以保證這一塊 lua 腳本的原子性。

首次加鎖分析:

  1. exists 命令判斷 redis anyLock 是否存在;
  2. 不存在,使用 hincrby 命令,創建 anyLock 數據;
  3. 對 anyLock 設置過期時間。

加鎖后 Redis 內的數據格式是:

關于 Redis 的 Hash 數據結構可以閱讀:https://redis.io/topics/data-types#hashes

抽象一點可以理解為 anyLock 下面掛著一個 K-V 結構的數據:

  1. "anyLock":{ 
  2.     "f400aad5-4b1f-4246-a81e-80c2717c3afb:1":"1" 

執行腳本

后續的內容就是進行請求執行 lua 腳本,唯一需要注意的地方就是有個哈希槽路由。

這塊代碼是在 CommandAsyncService#evalWriteAsync 方法處調用的,是為了獲取一個 NodeSource。

當然這個 NodeSource 里面只存放了一個 slot(哈希槽值)。

這個 slot 值是對加鎖的 key 使用 CRC16 算法計算出來的。

  1. // MAX_SLOT 默認 16384 
  2. int result = CRC16.crc16(key.getBytes()) % MAX_SLOT; 

這塊計算一個 slot 到底有什么用呢?

繼續追蹤!

BaseRedisBatchExecutor#addBatchCommandData 在這里會從 source 里面獲取到 solt,然后獲得 MasterSlaveEntry。

大概可以理解為這里是獲取到這個 Redis key 對應的節點。

可重入

既然是可重入鎖,這塊是支持可重入的,來看下可重入是如何保證的。

  1. exists 命令判斷 redis key field 是否存在;
  2. 存在 則通過 hincrby 命令對 key 的 field 對應 value 自增;
  3. 為當前 redis key 設置過期時間。

加鎖互斥

上面已經驗證了兩種情況:

  1. redis key 不存在;
  2. redis key 和 key 的 field 存在。

剩下的情況就是 key 存在的情況下,但是 field 不存在。

要知道 key 的 field 放的是 UUID:ThreadId,說明加鎖的不是當前線程。這時候直接返回當前鎖的剩余時間。

3、總結

本文主要介紹了 Redisson 可重入鎖的加鎖、鎖重入、鎖互斥邏輯。

核心重點在 lua 腳本。同時需要理解 Redis 的 Hash 數據結構。

同時需要記住,在未指定加鎖時間時,默認使用的是 30s。

最后,一張圖介紹本文加鎖邏輯。

 

 

責任編輯:武曉燕 來源: 程序員小航
相關推薦

2021-07-08 09:21:17

ZooKeeper分布式鎖 Curator

2021-07-10 10:02:30

ZooKeeperCurator并發

2021-06-30 14:56:12

Redisson分布式公平鎖

2021-07-01 09:42:08

Redisson分布式

2021-07-09 06:48:31

ZooKeeperCurator源碼

2021-07-03 17:45:57

分布式Redisson MultiLock

2021-07-06 08:37:29

Redisson分布式

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2022-08-04 08:45:50

Redisson分布式鎖工具

2025-07-30 09:34:04

2022-06-30 08:04:16

Redis分布式鎖Redisson

2021-07-07 07:09:49

Redisson分布式鎖源碼

2020-06-15 08:15:47

分布式鎖系統

2021-06-28 10:51:55

Redisson分布式鎖Watchdog

2024-01-02 13:15:00

分布式鎖RedissonRedis

2021-07-16 07:57:34

ZooKeeperCurator源碼

2023-08-27 22:13:59

Redisson分布式緩存

2024-01-30 08:41:33

線程執行Redis分布式鎖

2021-09-17 07:51:24

RedissonRedis分布式

2018-11-27 16:17:13

分布式Tomcat
點贊
收藏

51CTO技術棧公眾號

男女视频网站在线观看| 成人手机电影网| 亚洲男人的天堂在线| 美女av在线播放| 欧美日韩人人澡狠狠躁视频| 九色丨porny丨| 亚洲国产电影在线观看| aaa毛片在线观看| 久久一夜天堂av一区二区三区| 国产香蕉一区二区三区| 国产在线国偷精品免费看| 亚洲蜜桃av| 激情国产一区二区| 日本人妻伦在线中文字幕| 成人网男人的天堂| 久久精品香蕉视频| 亚洲欧洲国产专区| 色婷婷综合缴情免费观看| 无码av中文一区二区三区桃花岛| eeuss一区| 欧美午夜精品久久久| www在线视频| 日韩av一卡二卡| 韩国理伦片久久电影网| 欧美日韩福利视频| 日韩成人影院| 国产精品自拍区| 国产精品视频公开费视频| 午夜av一区| 亚洲最大福利视频网站| 五月婷婷亚洲| 亚洲成人精品电影在线观看| 国产美女一区二区三区| 少妇高潮喷水在线观看| 国产精品你懂的在线欣赏| 国产特级毛片| 中国丰满人妻videoshd| 国产经典欧美精品| 黄页免费在线观看视频| 亚洲乱码精品| 色偷偷噜噜噜亚洲男人的天堂| 成人看片免费| 国产精品美女主播| 欧美一区二区三区在线观看视频 | 99热最新在线| 先锋影音久久| 精品国产av无码一区二区三区| 国产欧美一区在线| 欧美国产美女| 久久久久亚洲av无码专区喷水| 久久久www免费人成精品| 午夜精品一区二区三区四区 | 97se亚洲国产综合自在线不卡| 久久韩剧网电视剧| 欧美电影在线观看免费| 蜜桃传媒视频麻豆一区| 日韩va欧美va亚洲va久久| av网站一区| 最新的欧美黄色| 久久久久久一级片| 免费毛片aaaaaa| 色婷婷综合久久久| 电影一区二区三区| 欧美激情一区二区三区在线视频 | 久久综合九色综合97婷婷 | 欧美亚洲高清| 水蜜桃一区二区| 国产精品福利影院| 亚洲h片在线看| 91精品国产高清久久久久久久久| 美日韩精品视频| 在线观看成人影院| 蜜桃视频在线观看成人| 亚洲综合在线观看视频| 亚洲网站三级| 妺妺窝人体色www看人体| 精品国产精品一区二区夜夜嗨| 狠狠入ady亚洲精品经典电影| 特级全黄一级毛片| 亚洲欧洲日韩在线| 久久久久久一区| 亚洲精品欧美二区三区中文字幕| 欧美人与性动交xxⅹxx| 九九久久九九久久| 亚洲系列中文字幕| 久久精品国产一区二区| 在线观看国产一级片| 亚洲国产欧美日韩精品| 久久久久久夜| 蜜芽tv福利在线视频| 涩涩涩999| 亚洲国产精品久久久久久| 国产精品国码视频| 福利在线小视频| 欧美日韩精品是欧美日韩精品| 热99在线观看| 欧美午夜影院一区| 久久久久国产一区二区三区四区| 中文字幕资源网在线观看免费| avtt在线播放| 久久综合中文| 久久人妻无码一区二区| 色偷偷久久人人79超碰人人澡| 在线观看视频一区二区三区| 精品一区二区成人免费视频| 欧美裸体一区二区三区| 国产精品久久久久免费a∨| 精品福利樱桃av导航| 欧美一区成人| 欧美影院一区| 黑粗硬长欧美在线视频免费的| 国产69精品99久久久久久宅男| 国产手机免费视频| 日本大胆在线观看| 亚洲www视频| 一区二区三区成人在线视频| 欧美经典一区| 国产日产欧美一区| 麻豆av在线播放| 欧美一区1区三区3区公司| 色呦呦日韩精品| 亚洲最大黄网| 精品无人乱码| 看国产成人h片视频| 国产高清一区在线观看| 亚洲在线第一页| 精品国产电影一区| 中文字幕一区二区三区乱码图片 | 欧美二区观看| 欧美视频在线免费播放| 国产一区二区观看| 国产一伦一伦一伦| 91地址最新发布| 一区二区三区蜜桃| 午夜片欧美伦| 99re在线视频| 欧洲精品在线一区| 亚洲天堂第一页| 久久99精品国产91久久来源| 久久国产日本精品| 综合天天久久| 欧美午夜一区| 国产精品99久| 国产精品激情| 欧美人成网站| 精品国产一区二区三区噜噜噜| **欧美日韩在线| 中文字幕一区二区三区在线不卡| 北岛玲heyzo一区二区| 91免费版看片| 日韩一区在线视频| 国产亚洲短视频| 国内精品久久久久久久影视简单 | 欧美亚洲国产视频| 亚洲午夜视频在线观看| 午夜日韩激情| av电影在线地址| av观看免费在线| 国产精品久久久久久久9999| 国产精品亚洲а∨天堂免在线| 成人sese在线| 精品日韩欧美在线| 精品亚洲一区二区| 中文字幕在线精品| 国产精品色悠悠| 高清av在线| 欧美激情视频一区二区三区免费| 一区二区三区高清视频在线观看| 欧美日韩第一区| 久久国产成人午夜av影院| 国产成人激情av| 欧美手机在线视频| 26uuu亚洲国产精品| 亚洲成人综合在线| 欧美日本二区| 成人黄色大片在线观看| 欧美一级夜夜爽| 欧美国产亚洲精品久久久8v| 久久av.com| 91精品国产色综合| 中文字幕黄色大片| 国产偷激情在线| wwwav在线| 久久青草久久| 91精品婷婷国产综合久久性色| 久久久成人精品| 国产精品99久久久久久久久| 品久久久久久久久久96高清| 美国av一区二区三区| 日韩美女爱爱视频| 美女黄视频在线播放| 欧洲精品99毛片免费高清观看| 国产三级一区| 成人高清电影网站| 日韩高清一级片| 国产精品传媒视频| 午夜精品久久久久久久久久久| 欧美视频专区一二在线观看| 91精品国产91久久久久久一区二区| 精品国产百合女同互慰|