国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微服務(wù)系列文章之 Redisson實(shí)現(xiàn)分布式鎖

這篇具有很好參考價(jià)值的文章主要介紹了微服務(wù)系列文章之 Redisson實(shí)現(xiàn)分布式鎖。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、高效分布式鎖

當(dāng)我們?cè)谠O(shè)計(jì)分布式鎖的時(shí)候,我們應(yīng)該考慮分布式鎖至少要滿足的一些條件,同時(shí)考慮如何高效的設(shè)計(jì)分布式鎖,這里我認(rèn)為以下幾點(diǎn)是必須要考慮的。

1、互斥

在分布式高并發(fā)的條件下,我們最需要保證,同一時(shí)刻只能有一個(gè)線程獲得鎖,這是最基本的一點(diǎn)。

2、防止死鎖

在分布式高并發(fā)的條件下,比如有個(gè)線程獲得鎖的同時(shí),還沒有來得及去釋放鎖,就因?yàn)橄到y(tǒng)故障或者其它原因使它無法執(zhí)行釋放鎖的命令,導(dǎo)致其它線程都無法獲得鎖,造成死鎖。

所以分布式非常有必要設(shè)置鎖的有效時(shí)間,確保系統(tǒng)出現(xiàn)故障后,在一定時(shí)間內(nèi)能夠主動(dòng)去釋放鎖,避免造成死鎖的情況。

3、性能

對(duì)于訪問量大的共享資源,需要考慮減少鎖等待的時(shí)間,避免導(dǎo)致大量線程阻塞。

所以在鎖的設(shè)計(jì)時(shí),需要考慮兩點(diǎn)。

1、鎖的顆粒度要盡量小。比如你要通過鎖來減庫存,那這個(gè)鎖的名稱你可以設(shè)置成是商品的ID,而不是任取名稱。這樣這個(gè)鎖只對(duì)當(dāng)前商品有效,鎖的顆粒度小。

2、鎖的范圍盡量要小。比如只要鎖2行代碼就可以解決問題的,那就不要去鎖10行代碼了。

4、重入

我們知道ReentrantLock是可重入鎖,那它的特點(diǎn)就是:同一個(gè)線程可以重復(fù)拿到同一個(gè)資源的鎖。重入鎖非常有利于資源的高效利用。關(guān)于這點(diǎn)之后會(huì)做演示。

針對(duì)以上Redisson都能很好的滿足,下面就來分析下它。

二、Redisson原理分析

為了更好的理解分布式鎖的原理,我這邊自己畫張圖通過這張圖來分析。

微服務(wù)系列文章之 Redisson實(shí)現(xiàn)分布式鎖,微服務(wù),分布式,wpf

1、加鎖機(jī)制

線程去獲取鎖,獲取成功: 執(zhí)行l(wèi)ua腳本,保存數(shù)據(jù)到redis數(shù)據(jù)庫。

線程去獲取鎖,獲取失敗: 一直通過while循環(huán)嘗試獲取鎖,獲取成功后,執(zhí)行l(wèi)ua腳本,保存數(shù)據(jù)到redis數(shù)據(jù)庫。

2、watch dog自動(dòng)延期機(jī)制

這個(gè)比較難理解,找了些許資料感覺也并沒有解釋的很清楚。這里我自己的理解就是:

在一個(gè)分布式環(huán)境下,假如一個(gè)線程獲得鎖后,突然服務(wù)器宕機(jī)了,那么這個(gè)時(shí)候在一定時(shí)間后這個(gè)鎖會(huì)自動(dòng)釋放,你也可以設(shè)置鎖的有效時(shí)間(不設(shè)置默認(rèn)30秒),這樣的目的主要是防止死鎖的發(fā)生。

但在實(shí)際開發(fā)中會(huì)有下面一種情況:

   //設(shè)置鎖1秒過去
        redissonLock.lock("redisson", 1);
        /**
         * 業(yè)務(wù)邏輯需要咨詢2秒
         */
        redissonLock.release("redisson");

      /**
       * 線程1 進(jìn)來獲得鎖后,線程一切正常并沒有宕機(jī),但它的業(yè)務(wù)邏輯需要執(zhí)行2秒,這就會(huì)有個(gè)問題,在 線程1 執(zhí)行1秒后,這個(gè)鎖就自動(dòng)過期了,
       * 那么這個(gè)時(shí)候 線程2 進(jìn)來了。那么就存在 線程1和線程2 同時(shí)在這段業(yè)務(wù)邏輯里執(zhí)行代碼,這當(dāng)然是不合理的。
       * 而且如果是這種情況,那么在解鎖時(shí)系統(tǒng)會(huì)拋異常,因?yàn)榻怄i和加鎖已經(jīng)不是同一線程了,具體后面代碼演示。
       */

所以這個(gè)時(shí)候看門狗就出現(xiàn)了,它的作用就是 線程1 業(yè)務(wù)還沒有執(zhí)行完,時(shí)間就過了,線程1 還想持有鎖的話,就會(huì)啟動(dòng)一個(gè)watch dog后臺(tái)線程,不斷的延長(zhǎng)鎖key的生存時(shí)間。

注意?正常這個(gè)看門狗線程是不啟動(dòng)的,還有就是這個(gè)看門狗啟動(dòng)后對(duì)整體性能也會(huì)有一定影響,所以不建議開啟看門狗。

3、為啥要用lua腳本呢?

這個(gè)不用多說,主要是如果你的業(yè)務(wù)邏輯復(fù)雜的話,通過封裝在lua腳本中發(fā)送給redis,而且redis是單線程的,這樣就保證這段復(fù)雜業(yè)務(wù)邏輯執(zhí)行的原子性。

4、可重入加鎖機(jī)制

Redisson可以實(shí)現(xiàn)可重入加鎖機(jī)制的原因,我覺得跟兩點(diǎn)有關(guān):

<span style="color:#4b4b4b"><span style="background-color:#ffffff"><code class="language-vbnet"><span style="color:#ae81ff">1</span>、Redis存儲(chǔ)鎖的數(shù)據(jù)類型是 Hash類型
<span style="color:#ae81ff">2</span>、Hash數(shù)據(jù)類型的<span style="color:#f92672">key</span>值包含了當(dāng)前線程信息。
</code></span></span>

下面是redis存儲(chǔ)的數(shù)據(jù)

微服務(wù)系列文章之 Redisson實(shí)現(xiàn)分布式鎖,微服務(wù),分布式,wpf

這里表面數(shù)據(jù)類型是Hash類型,Hash類型相當(dāng)于我們java的?<key,<key1,value>>?類型,這里key是指 'redisson'

它的有效期還有9秒,我們?cè)賮砜蠢飩兊膋ey1值為078e44a3-5f95-4e24-b6aa-80684655a15a:45它的組成是:

guid + 當(dāng)前線程的ID。后面的value是就和可重入加鎖有關(guān)。

舉圖說明

微服務(wù)系列文章之 Redisson實(shí)現(xiàn)分布式鎖,微服務(wù),分布式,wpf

上面這圖的意思就是可重入鎖的機(jī)制,它最大的優(yōu)點(diǎn)就是相同線程不需要在等待鎖,而是可以直接進(jìn)行相應(yīng)操作。

5、Redis分布式鎖的缺點(diǎn)

Redis分布式鎖會(huì)有個(gè)缺陷,就是在Redis哨兵模式下:

客戶端1?對(duì)某個(gè)master節(jié)點(diǎn)寫入了redisson鎖,此時(shí)會(huì)異步復(fù)制給對(duì)應(yīng)的 slave節(jié)點(diǎn)。但是這個(gè)過程中一旦發(fā)生 master節(jié)點(diǎn)宕機(jī),主備切換,slave節(jié)點(diǎn)從變?yōu)榱?master節(jié)點(diǎn)。

這時(shí)客戶端2?來嘗試加鎖的時(shí)候,在新的master節(jié)點(diǎn)上也能加鎖,此時(shí)就會(huì)導(dǎo)致多個(gè)客戶端對(duì)同一個(gè)分布式鎖完成了加鎖。

這時(shí)系統(tǒng)在業(yè)務(wù)語義上一定會(huì)出現(xiàn)問題,導(dǎo)致各種臟數(shù)據(jù)的產(chǎn)生。

缺陷在哨兵模式或者主從模式下,如果 master實(shí)例宕機(jī)的時(shí)候,可能導(dǎo)致多個(gè)客戶端同時(shí)完成加鎖。文章來源地址http://www.zghlxwxcb.cn/news/detail-554987.html

到了這里,關(guān)于微服務(wù)系列文章之 Redisson實(shí)現(xiàn)分布式鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Redisson實(shí)現(xiàn)分布式鎖示例

    Redisson實(shí)現(xiàn)分布式鎖示例

    可以下載redis desktop manager軟件來查看redis里面存放的東西 紅色框內(nèi)的TTL值就是過期時(shí)間,默認(rèn)-1,表示永不過期,指定過期時(shí)間后就變成你指定的值了。 上面的方法,我們讓線程睡眠60S,代表我們的業(yè)務(wù)執(zhí)行時(shí)間,在調(diào)用這個(gè)方法時(shí),我們可以在 redis desktop manager軟件上實(shí)時(shí)查

    2024年02月12日
    瀏覽(22)
  • SpringBoot結(jié)合Redisson實(shí)現(xiàn)分布式鎖

    SpringBoot結(jié)合Redisson實(shí)現(xiàn)分布式鎖

    ?????作者名稱:DaenCode ??作者簡(jiǎn)介:啥技術(shù)都喜歡搗鼓搗鼓,喜歡分享技術(shù)、經(jīng)驗(yàn)、生活。 ??人生感悟:嘗盡人生百味,方知世間冷暖。 ??所屬專欄:SpringBoot實(shí)戰(zhàn) 以下是專欄部分內(nèi)容,更多內(nèi)容請(qǐng)前往專欄查看! 標(biāo)題 一文帶你學(xué)會(huì)使用SpringBoot+Avue實(shí)現(xiàn)短信通知功能

    2024年02月08日
    瀏覽(25)
  • 圖解Redisson如何實(shí)現(xiàn)分布式鎖、鎖續(xù)約?

    圖解Redisson如何實(shí)現(xiàn)分布式鎖、鎖續(xù)約?

    使用當(dāng)前(2022年12月初)最新的版本:3.18.1; 案例 案例采用redis-cluster集群的方式; redission支持4種連接redis方式,分別為單機(jī)、主從、Sentinel、Cluster 集群;在分布式鎖的實(shí)現(xiàn)上區(qū)別在于hash槽的獲取方式。 具體配置方式見Redisson的GitHub(https://github.com/redisson/redisson/wiki/2.-%E9

    2023年04月16日
    瀏覽(31)
  • Spring Boot 集成 Redisson 實(shí)現(xiàn)分布式鎖

    Spring Boot 集成 Redisson 實(shí)現(xiàn)分布式鎖

    ????????Redisson 是一種基于 Redis 的 Java 駐留集群的分布式對(duì)象和服務(wù)庫,可以為我們提供豐富的分布式鎖和線程安全集合的實(shí)現(xiàn)。在 Spring Boot 應(yīng)用程序中使用 Redisson 可以方便地實(shí)現(xiàn)分布式應(yīng)用程序的某些方面,例如分布式鎖、分布式集合、分布式事件發(fā)布和訂閱等。本篇

    2024年02月08日
    瀏覽(24)
  • Redis分布式鎖及Redisson的實(shí)現(xiàn)原理

    Redis分布式鎖及Redisson的實(shí)現(xiàn)原理

    Redis分布式鎖 在討論分布式鎖之前我們回顧一下一些單機(jī)鎖,比如synchronized、Lock 等 鎖的基本特性: 1.互斥性:同一時(shí)刻只能有一個(gè)節(jié)點(diǎn)訪問共享資源,比如一個(gè)代碼塊,或者同一個(gè)訂單同一時(shí)刻只能有一個(gè)線程去支付等。 2.可重入性: 允許一個(gè)已經(jīng)獲得鎖的線程,在沒有釋

    2024年02月06日
    瀏覽(23)
  • 源碼篇--Redisson 分布式鎖lock的實(shí)現(xiàn)

    我們知道Redis 緩存可以使用setNx來作為分布式鎖,但是我們直接使用setNx 需要考慮鎖過期的問題;此時(shí)我們可以使用Redisson 的lock 來實(shí)現(xiàn)分布式鎖,那么lock 內(nèi)部幫我們做了哪些工作呢。 RedisConfig.java lock.lock() 阻塞獲取 redis 鎖,獲取到鎖之后繼續(xù)向下執(zhí)行業(yè)務(wù)邏輯; lockInterr

    2024年01月25日
    瀏覽(33)
  • 在Java項(xiàng)目中使用redisson實(shí)現(xiàn)分布式鎖

    在Java項(xiàng)目中使用Redission自定義注解實(shí)現(xiàn)分布式鎖: 添加Redission依賴項(xiàng):在項(xiàng)目的pom.xml中添加Redission依賴項(xiàng): 創(chuàng)建自定義注解:創(chuàng)建一個(gè)自定義注解來標(biāo)記需要使用分布式鎖的方法。例如,創(chuàng)建一個(gè)名為 @DistributedLock 的注解: 創(chuàng)建注解切面:創(chuàng)建一個(gè)切面類,通過AOP將注解

    2024年02月16日
    瀏覽(25)
  • spring boot 實(shí)現(xiàn)Redisson分布式鎖及其讀寫鎖

    分布式鎖,就是控制分布式系統(tǒng)中不同進(jìn)程共同訪問同一共享資源的一種鎖的實(shí)現(xiàn)。 1、引入依賴 2、配置文件 3、配置類 4、測(cè)試代碼 5、理解 一、時(shí)間設(shè)置 默認(rèn) lock() 小結(jié) lock.lock (); (1)默認(rèn)指定鎖時(shí)間為30s(看門狗時(shí)間) (2)鎖的自動(dòng)續(xù)期:若是業(yè)務(wù)超長(zhǎng),運(yùn)行期間自

    2024年02月12日
    瀏覽(20)
  • redis實(shí)戰(zhàn)-redis實(shí)現(xiàn)分布式鎖&redisson快速入門

    redis實(shí)戰(zhàn)-redis實(shí)現(xiàn)分布式鎖&redisson快速入門

    前言 集群環(huán)境下的并發(fā)問題 ?分布式鎖 定義 需要滿足的條件 常見的分布式鎖 redis實(shí)現(xiàn)分布式鎖 核心思路 代碼實(shí)現(xiàn) 誤刪情況 邏輯說明 解決方案 代碼實(shí)現(xiàn) 更為極端的誤刪情況 Lua腳本解決原子性問題 分布式鎖-redission redisson的概念 快速入門 總結(jié) 在前面我們已經(jīng)實(shí)現(xiàn)了單機(jī)

    2024年02月09日
    瀏覽(26)
  • 【Redisson】分布式鎖源碼分析如何實(shí)現(xiàn)多個(gè)應(yīng)用實(shí)例互斥

    lockName就是保存到Redis里面的key 直接進(jìn)行構(gòu)建方法里面的 super(commandExecutor, name); org.redisson.connection.ServiceManager : private final String id = UUID.randomUUID().toString(); 這個(gè) id 就是 UUID : this.id = getServiceManager().getId(); 這個(gè)entryName通過UUID可以區(qū)分是哪個(gè)應(yīng)用實(shí)例 entryName+threadId可以區(qū)分哪個(gè)應(yīng)

    2024年02月11日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包