成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[407548]]

前言

相信小伙伴都是使用分布式服務(wù),那一定繞不開分布式服務(wù)中數(shù)據(jù)并發(fā)更新問題!

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

當(dāng)然是使用分布式鎖。

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

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

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

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

1、環(huán)境配置

  • 本地環(huán)境搭建的偽集群:

  • redisson 3.15.6

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

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

 

  • 項目準(zhǔn)備

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

2、可重入鎖加鎖

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

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

剩下的一路挺進(jìn)即可。

在調(diào)用 tryAcquire 方法之前,多了一個參數(shù) threadId,是當(dāng)前線程的 id,long 型正數(shù)。

異步加鎖

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

tryAcquireAsync

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

至此幾個參數(shù)已經(jīng)清楚:

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

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

加鎖邏輯

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

先說明一下 lua 腳本的參數(shù)信息:

  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 命令,創(chuàng)建 anyLock 數(shù)據(jù);
  3. 對 anyLock 設(shè)置過期時間。

加鎖后 Redis 內(nèi)的數(shù)據(jù)格式是:

關(guān)于 Redis 的 Hash 數(shù)據(jù)結(jié)構(gòu)可以閱讀:https://redis.io/topics/data-types#hashes

抽象一點可以理解為 anyLock 下面掛著一個 K-V 結(jié)構(gòu)的數(shù)據(jù):

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

執(zhí)行腳本

后續(xù)的內(nèi)容就是進(jìn)行請求執(zhí)行 lua 腳本,唯一需要注意的地方就是有個哈希槽路由。

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

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

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

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

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

繼續(xù)追蹤!

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

大概可以理解為這里是獲取到這個 Redis key 對應(yīng)的節(jié)點。

可重入

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

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

加鎖互斥

上面已經(jīng)驗證了兩種情況:

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

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

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

3、總結(jié)

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

核心重點在 lua 腳本。同時需要理解 Redis 的 Hash 數(shù)據(jù)結(jié)構(gòu)。

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

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

 

 

責(zé)任編輯:武曉燕 來源: 程序員小航
相關(guān)推薦

2021-07-08 09:21:17

ZooKeeper分布式鎖 Curator

2021-07-10 10:02:30

ZooKeeperCurator并發(fā)

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分布式鎖工具

2022-06-30 08:04:16

Redis分布式鎖Redisson

2021-07-07 07:09:49

Redisson分布式鎖源碼

2020-06-15 08:15:47

分布式鎖系統(tǒng)

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

線程執(zhí)行Redis分布式鎖

2021-09-17 07:51:24

RedissonRedis分布式

2018-11-27 16:17:13

分布式Tomcat

2021-11-26 06:43:19

Java分布式
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区在线 | 免费久久精品视频 | 男女在线网站 | 久久久免费电影 | 91久久夜色精品国产网站 | 午夜亚洲| 久久精品91久久久久久再现 | 国产精品污www在线观看 | 黄色网址大全在线观看 | 91啪亚洲精品| 亚洲风情在线观看 | 国产成人一区二区 | 亚洲精品电影在线观看 | 97成人在线 | 成人小视频在线免费观看 | 日韩国产一区二区三区 | 91国内精精品久久久久久婷婷 | 国产欧美精品一区二区色综合朱莉 | 久久亚洲天堂 | 亚洲网站在线观看 | 久久精品免费看 | 日日干夜夜操天天操 | 狠狠干在线 | 97精品国产97久久久久久免费 | 国产精品久久久久久久久久久久久 | 亚洲精品乱码久久久久久按摩观 | 亚洲视频在线观看一区二区三区 | 亚洲福利视频一区二区 | 久久夜夜| 狠狠爱视频 | 国产 日韩 欧美 在线 | 欧美日韩综合视频 | 中文字幕国产 | 国产欧美日韩在线一区 | 午夜av毛片 | 免费一级黄| 日韩av在线免费 | 久久久性 | 成人福利视频网站 | 四虎影院新网址 | 亚洲一区二区在线播放 |