最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Redisson分布式鎖底層實現(xiàn)原理

 更新時間:2023年07月12日 09:29:08   作者:_Apricity  
這篇文章主要詳細(xì)介紹了Redisson分布式鎖底層實現(xiàn)原理,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在Java中有很多保證線程安全的方式,比如synchorized,lock鎖等等,這些在單機(jī)環(huán)境下都能發(fā)揮不錯的作用,但是在分布式的環(huán)境下,這些機(jī)制就會失去大部分的作用。

在分布式環(huán)境下就需要引入分布式鎖,實現(xiàn)分布式鎖的方式有好多種,比如redis、zookeeper,或者通過數(shù)據(jù)庫來實現(xiàn),但是在分布式的情況下還需要考慮機(jī)器宕機(jī)的情況,如果某臺機(jī)器上的線程獲取到了這個鎖,但此時機(jī)器宕機(jī)了。那么就沒辦法去釋放,就會造成死鎖的情況。

為了避免這種情況,就需要給鎖加上一個過期時間,而過期時間的設(shè)定又是一個令人非常頭疼的問題。

在Redisson種有一個看門狗機(jī)制,它給出了一種過期時間的很好的解決辦法。下面就來研究一下它具體實現(xiàn)吧。

Redisson的加鎖入口是tryLock(),此方法需提供獲取鎖的等待時間,如果在規(guī)定時間內(nèi)未搶到鎖,會返回false。

這里可以看到tryLock()方法實際上是調(diào)用了下面這個方法,這里給了一個leaseTime的默認(rèn)值,至于為什么是-1,我們接著往下看。

進(jìn)來之后會發(fā)現(xiàn),這個方法的核心就是執(zhí)行一個tryAcquire方法,我們點進(jìn)去看一下。

tryAcquire方法實際會去執(zhí)行tryAcquireAsync異步的去獲取鎖,然后再使用get獲取結(jié)果,如果結(jié)果為null代表獲取鎖成功,這里后面會講。

然后進(jìn)到tryAcquireAsync方法,在這里判斷了leaseTime是不是-1,如果我們自己設(shè)定了過期時間,那么就會以我們設(shè)置的為準(zhǔn),并且不會去開啟自動續(xù)期。

如果是默認(rèn)的-1,那么異步獲取鎖之后,后面還會去開啟一個自動續(xù)期的定時任務(wù)。

異步獲取鎖是通過tryLockInnerAsync這個方法實現(xiàn)的。第一個參數(shù)是30000,傳入的是commandExecutor.getConnectionManager().getCfg().getLockWatchdogTimeout(),點進(jìn)去可以看到

在這個方法里使用lua腳本的方式去執(zhí)行了set操作

這段lua腳本的意思是:

鎖不存在,加鎖成功,設(shè)置hash數(shù)據(jù)結(jié)構(gòu)鎖: 鎖名 -> 加鎖線程:id -> 加鎖次數(shù)(1)
鎖存在且是本線程的鎖 加鎖次數(shù)增加:鎖名 -> 加鎖線程:id -> 加鎖次數(shù)+1
鎖存在且不是本線程的鎖 加鎖失敗 返回鎖剩余過期時間

從這里也可以體現(xiàn)出此鎖的可重入,即某一線程獲取到鎖之后,那么這個線程再去獲取該鎖的話也可以成功

同時也可以如果返回為null那么說明獲取鎖成功。

然后后面會判斷如果結(jié)果為null,就會去執(zhí)行scheduleExpirationRenewal(threadId)方法,進(jìn)去看一下

由于我們的Redission的分布式鎖是可重入鎖,所以這里會首先判斷一下是不是第一次加鎖,如果不是第一次則加鎖次數(shù)加 1 不會再開啟續(xù)期 因為第一次加鎖時調(diào)用

如果是第一次加鎖的話就回去調(diào)用renewExpiraton()去開啟自動續(xù)期。

addThreadId:重入次數(shù)+1

renewExpiraton()開啟自動續(xù)期這個方法里面創(chuàng)建了一個定時任務(wù),主要邏輯是通過renewExpirationAsync(threadId)方法去執(zhí)行續(xù)期邏輯,執(zhí)行成功后還會通過下面if (res) {renewExpiration();}方法遞歸調(diào)用。

注意到這個線程執(zhí)行的間隔是internalLockLeaseTime / 3,也就是30 / 3 = 10s

我們可以看一下renewExpirationAsync方法里面的邏輯

此lua腳本的意思是:當(dāng)前線程持有的鎖是否還存在 存在的話重新設(shè)置鎖的過期時間(默認(rèn) 30 秒)

至此加鎖的邏輯就追完了。

下面我們看一看釋放鎖的邏輯。其入口為:unlock方法,它會去調(diào)用unlockAsync方法。

unlockAsync里面掉了unlockInnerAsync方法去釋放鎖,

unlockInnerAsync方法點進(jìn)去我們可以看到它也是通過lua腳本的方式去釋放鎖。

若鎖不存在 返回 若鎖存在 加鎖次數(shù) -1 若加鎖次數(shù)仍不等于 0 (可重入),重新設(shè)置鎖的過期時間,返回 若加鎖次數(shù)減為 0,刪除鎖,同步發(fā)布釋放鎖事件,返回

以上就是一文詳解Redisson分布式鎖底層實現(xiàn)原理的詳細(xì)內(nèi)容,更多關(guān)于Redisson分布式鎖實現(xiàn)原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot、Java 使用 Jsoup 解析 HTML 頁面的詳細(xì)步驟

    SpringBoot、Java 使用 Jsoup 解析 HTML 頁面

    這篇文章主要介紹了SpringBoot、Java 使用 Jsoup 解析 HTML 頁面的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • MapReduce實現(xiàn)TopN效果示例解析

    MapReduce實現(xiàn)TopN效果示例解析

    這篇文章主要為大家介紹了MapReduce實現(xiàn)TopN效果示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • java如何上傳文件到sftp服務(wù)器

    java如何上傳文件到sftp服務(wù)器

    本文主要講述了如何使用JSch庫將數(shù)據(jù)文件上傳到SFTP服務(wù)器,并分享了過程中遇到的一些坑,例如目錄創(chuàng)建、文件刪除等問題,以及如何使用SFTP通道執(zhí)行命令、文件上傳等操作,通過本文,讀者可以了解SFTP上傳文件的基本步驟和注意事項,同時也提供了一些解決方法
    2026-04-04
  • 詳解Spring FactoryBean靈活創(chuàng)建復(fù)雜對象的秘密武器

    詳解Spring FactoryBean靈活創(chuàng)建復(fù)雜對象的秘密武器

    FactoryBean是Spring框架中用于創(chuàng)建復(fù)雜Bean的接口,通過編程方式控制Bean的創(chuàng)建過程,它允許開發(fā)者自定義Bean的創(chuàng)建邏輯,適用于集成第三方庫、延遲初始化、動態(tài)代理和統(tǒng)一管理資源等場景,本文介紹Spring FactoryBean創(chuàng)建復(fù)雜對象的相關(guān)操作,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot使用AOP記錄接口操作日志的方法

    SpringBoot使用AOP記錄接口操作日志的方法

    日志記錄量是很大的,所以只記錄關(guān)鍵地方并按期歸檔,最好是存在如elasticsearch中,如果存在數(shù)據(jù)庫中,分表是不錯的選擇,這篇文章主要介紹了SpringBoot使用AOP記錄接口操作日志的方法,需要的朋友可以參考下
    2022-08-08
  • Spring?Retry實現(xiàn)重試機(jī)制的示例詳解

    Spring?Retry實現(xiàn)重試機(jī)制的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Spring-Retry的用法以及實現(xiàn)原理是怎么樣的,文中的示例代碼講解詳細(xì),具有一定的參考價值,需要的可以了解一下
    2023-07-07
  • SpringSecurity OAtu2+JWT實現(xiàn)微服務(wù)版本的單點登錄的示例

    SpringSecurity OAtu2+JWT實現(xiàn)微服務(wù)版本的單點登錄的示例

    本文主要介紹了SpringSecurity OAtu2+JWT實現(xiàn)微服務(wù)版本的單點登錄的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java?將Excel轉(zhuǎn)為UOS的操作方法

    Java?將Excel轉(zhuǎn)為UOS的操作方法

    以.uos為后綴的文件,表示Uniform?Office?Spreadsheet文件,是一種國產(chǎn)的辦公文件格式,該格式以統(tǒng)一辦公格式(UOF)創(chuàng)建,使用XML和壓縮保存電子表格,這篇文章主要介紹了Java?將Excel轉(zhuǎn)為UOS,需要的朋友可以參考下
    2022-09-09
  • SpringMVC @RequestBody自動轉(zhuǎn)json Http415錯誤的解決

    SpringMVC @RequestBody自動轉(zhuǎn)json Http415錯誤的解決

    這篇文章主要介紹了SpringMVC @RequestBody自動轉(zhuǎn)json Http415錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java 中createStatement()方法的實例詳解

    java 中createStatement()方法的實例詳解

    這篇文章主要介紹了java 中createStatement()方法的實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論

兴文县| 沈丘县| 潼关县| 铁力市| 丰原市| 大连市| 顺昌县| 津市市| 东莞市| 宾阳县| 松阳县| 治县。| 江西省| 梁山县| 七台河市| 长武县| 西盟| 尼勒克县| 如皋市| 凤城市| 平远县| 红桥区| 遵义市| 嵊州市| 三原县| 丰城市| 和田县| 枣强县| 星子县| 台东县| 石台县| 元阳县| 通州市| 若尔盖县| 武安市| 泰和县| 桐柏县| 玉山县| 咸宁市| 青阳县| 晋中市|