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

【Redisson】分布式鎖源碼分析如何實現(xiàn)多個應用實例互斥

這篇具有很好參考價值的文章主要介紹了【Redisson】分布式鎖源碼分析如何實現(xiàn)多個應用實例互斥。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

入口org.redisson.api.RedissonClient

@Resource
private RedissonClient redissonClient;
...

RLock rLock = redissonClient.getLock(lockName);

lockName就是保存到Redis里面的key

進入org.redisson.Redisson.getLock

    @Override
    public RLock getLock(String name) {
        return new RedissonLock(commandExecutor, name);
    }

進入org.redisson.RedissonLock

直接進行構(gòu)建方法里面的super(commandExecutor, name);

    public RedissonBaseLock(CommandAsyncExecutor commandExecutor, String name) {
        super(commandExecutor, name);
        this.id = getServiceManager().getId();
        this.internalLockLeaseTime = getServiceManager().getCfg().getLockWatchdogTimeout();
        this.entryName = id + ":" + name;
    }
  • org.redisson.connection.ServiceManager: private final String id = UUID.randomUUID().toString();
  • 這個id就是UUID: this.id = getServiceManager().getId();
  • 這個entryName通過UUID可以區(qū)分是哪個應用實例
  • entryName+threadId可以區(qū)分哪個應用實例的哪個進程持有鎖

rLock.tryLock(60, TimeUnit.SECONDS);

嘗試獲取鎖

進入org.redisson.RedissonLock

    <T> RFuture<T> tryLockInnerAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand<T> command) {
        return commandExecutor.syncedEval(getRawName(), LongCodec.INSTANCE, command,
                "if ((redis.call('exists', KEYS[1]) == 0) " +
                            "or (redis.call('hexists', KEYS[1], ARGV[2]) == 1)) then " +
                        "redis.call('hincrby', KEYS[1], ARGV[2], 1); " +
                        "redis.call('pexpire', KEYS[1], ARGV[1]); " +
                        "return nil; " +
                    "end; " +
                    "return redis.call('pttl', KEYS[1]);",
                Collections.singletonList(getRawName()), unit.toMillis(leaseTime), getLockName(threadId));
    }
  • Collections.singletonList(getRawName()),這個參數(shù)就是Redis的key
  • unit.toMillis(leaseTime),這個參數(shù)是Lua腳本的第1個參數(shù),即ARGV[1]
  • getLockName(threadId),這個參數(shù)是Lua腳本的第2個參數(shù),即ARGV[2]
  • 這段Lua腳本的含義解析
  • (redis.call('exists', KEYS[1]) == 0),鎖不存在
  • or (redis.call('hexists', KEYS[1], ARGV[2]) == 1)),鎖存在,但是當前實例線程擁有該鎖
  • 以上兩種情況,均代表加鎖成功,則返回null
  • 否則返回這個鎖對應的TTL時間
  • 所以外層調(diào)用的地方是根據(jù)返回的ttl是否為null來判斷加鎖是否成功
        Long ttl = tryAcquire(waitTime, leaseTime, unit, threadId);
        // lock acquired
        if (ttl == null) {
            return true;
        }

進入Lua腳本的第2個參數(shù)getLockName

    protected String getLockName(long threadId) {
        return id + ":" + threadId;
    }

這個id就是上面提到的UUID,結(jié)合線程ID,可以判斷是哪個應用實例的哪個進程持有鎖文章來源地址http://www.zghlxwxcb.cn/news/detail-501055.html

到了這里,關(guān)于【Redisson】分布式鎖源碼分析如何實現(xiàn)多個應用實例互斥的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

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

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

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

    2024年02月12日
    瀏覽(22)
  • redisson+aop實現(xiàn)分布式鎖

    基于注解實現(xiàn),一個注解搞定緩存 Aop:面向切面編程,在不改變核心代碼的基礎上實現(xiàn)擴展,有以下應用場景 ①事務 ②日志 ③controlleradvice+expetcationhandle實現(xiàn)全局異常 ④redissson+aop實現(xiàn)分布式鎖 ⑤認證授權(quán) Aop的實現(xiàn)存在與bean的后置處理器beanpostprocessAfterinitlazing 注解的定義仿照

    2024年01月19日
    瀏覽(26)
  • SpringBoot結(jié)合Redisson實現(xiàn)分布式鎖

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

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

    2024年02月08日
    瀏覽(25)
  • 【分布式鎖】06-Zookeeper實現(xiàn)分布式鎖:可重入鎖源碼分析

    前言 前面已經(jīng)講解了Redis的客戶端Redission是怎么實現(xiàn)分布式鎖的,大多都深入到源碼級別。 在分布式系統(tǒng)中,常見的分布式鎖實現(xiàn)方案還有Zookeeper,接下來會深入研究Zookeeper是如何來實現(xiàn)分布式鎖的。 Zookeeper初識 文件系統(tǒng) Zookeeper維護一個類似文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu) image.png 每

    2024年02月22日
    瀏覽(19)
  • Spring Boot 集成 Redisson 實現(xiàn)分布式鎖

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

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

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

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

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

    2024年02月06日
    瀏覽(23)
  • 微服務系列文章之 Redisson實現(xiàn)分布式鎖

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

    當我們在設計分布式鎖的時候,我們應該考慮分布式鎖至少要滿足的一些條件,同時考慮如何高效的設計分布式鎖,這里我認為以下幾點是必須要考慮的。 1、互斥 在分布式高并發(fā)的條件下,我們最需要保證,同一時刻只能有一個線程獲得鎖,這是最基本的一點。 2、防止死

    2024年02月15日
    瀏覽(19)
  • 微服務系列文章之 Redisson實現(xiàn)分布式鎖(2)

    1、概念 很明顯RLock是繼承Lock鎖,所以他有Lock鎖的所有特性,比如lock、unlock、trylock等特性,同時它還有很多新特性:強制鎖釋放,帶有效期的鎖,。 2、RLock鎖API 這里針對上面做個整理,這里列舉幾個常用的接口說明 RLock相關(guān)接口,主要是新添加了? leaseTime ?屬性字段,主要是

    2024年02月16日
    瀏覽(21)
  • 微服務系列文章之 Redisson實現(xiàn)分布式鎖(3)

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

    1、技術(shù)架構(gòu) 項目總體技術(shù)選型 2、加鎖方式 該項目支持? 自定義注解加鎖 ?和? 常規(guī)加鎖 ?兩種模式 自定義注解加鎖 常規(guī)加鎖 3、Redis部署方式 該項目支持四種Redis部署方式 該項目已經(jīng)實現(xiàn)支持上面四種模式,你要采用哪種只需要修改配置文件 application.properties ,項目代碼

    2024年02月16日
    瀏覽(18)
  • 在Java項目中使用redisson實現(xiàn)分布式鎖

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

    2024年02月16日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包