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

redisson特性及優(yōu)雅實(shí)現(xiàn)示例

 更新時間:2022年11月01日 15:36:28   作者:你行你上啊  
這篇文章主要為大家介紹了redisson特性及優(yōu)雅實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

redisson的幾大特性

相信看了這個標(biāo)題的同學(xué),對這個問題以已經(jīng)非常不陌生了,信手拈來redisson的幾大特性:

可重入性

【多個業(yè)務(wù)線同一時刻n條扣款,如果用setnx,我怎么監(jiān)控的加鎖解鎖線程?死鎖不得發(fā)生吶?】

redisson使用hash結(jié)構(gòu),業(yè)務(wù)名稱作為key,uuid+線程id作為field,加鎖次數(shù)作為value,這不就解決上述問題了嗎

阻塞能力

【加鎖有兩個策略,一是互斥,二是阻塞?;コ獗热缯f定時任務(wù),同一時刻我需要只執(zhí)行一次就行。阻塞的話-例如多個業(yè)務(wù)線同一時刻n條扣款,我不能互斥掉吧,那不得被噴死。我得寫個while死循環(huán)【標(biāo)準(zhǔn)用語就是自旋】一段時間在獲取一次,保證系統(tǒng)都能處理這些請求】

續(xù)約

加鎖過期時間短-加鎖邏輯還沒執(zhí)行完就解鎖了是不是很尷尬,過長的話-宕機(jī)恢復(fù)時間又變長

redisson默認(rèn)30秒給你執(zhí)行,30秒沒執(zhí)行完就續(xù)約30s,宕機(jī)的話恢復(fù)時間也不會太長。

原理呢就是使用了netty的時間輪實(shí)現(xiàn)。簡單點(diǎn)說就是環(huán)形數(shù)組。

直通車:

RedissonLock --> renewExpiration -->TimerTask
Timeout task = commandExecutor.getConnectionManager().newTimeout(new TimerTask() {
    @Override
    public void run(Timeout timeout) throws Exception {
        ExpirationEntry ent = EXPIRATION_RENEWAL_MAP.get(getEntryName());
        if (ent == null) {
            return;
        }
        Long threadId = ent.getFirstThreadId();
        if (threadId == null) {
            return;
        }
        RFuture<Boolean> future = renewExpirationAsync(threadId);
        future.onComplete((res, e) -> {
            if (e != null) {
                log.error("Can't update lock " + getName() + " expiration", e);
                return;
            }
            if (res) {
                // reschedule itself
                renewExpiration();
            }
        });
    }
}, internalLockLeaseTime / 3, TimeUnit.MILLISECONDS);
// internalLockLeaseTime默認(rèn)30s,因此這里默認(rèn)延遲10s后執(zhí)行
// 其中TimerTask引用的就是netty中的TimerTask

初始化timer的代碼

protected void initTimer(MasterSlaveServersConfig config) {
    int[] timeouts = new int[]{config.getRetryInterval(), config.getTimeout()};
    Arrays.sort(timeouts);
    int minTimeout = timeouts[0];
    if (minTimeout % 100 != 0) {
        minTimeout = (minTimeout % 100) / 2;
    } else if (minTimeout == 100) {
        minTimeout = 50;
    } else {
        minTimeout = 100;
    }
    // 就是分成了1024個格子,每個格子默認(rèn)100ms
    timer = new HashedWheelTimer(new DefaultThreadFactory("redisson-timer"), minTimeout, TimeUnit.MILLISECONDS, 1024, false);
    connectionWatcher = new IdleConnectionWatcher(this, config);
    subscribeService = new PublishSubscribeService(this, config);
}

大白話講就是:例如將一個圓分成4等分,1,2,3,4,從1到2需要100ms,那么我需要計(jì)算延遲500ms需要走幾步,下標(biāo)是多少?

既然是時間總要跳動嘛,沒猜錯就是sleep??

  • 紅鎖

如果redis節(jié)點(diǎn)宕機(jī)大部分節(jié)點(diǎn)同意獲取鎖,才能獲取到鎖。

  • 聯(lián)鎖

全部節(jié)點(diǎn)加鎖成功才算加鎖成功。

  • 加鎖流程

lua判斷鎖是否存在

--> 不存在創(chuàng)建hash,當(dāng)前業(yè)務(wù)key,uuid+線程id為field,value =1 ,設(shè)置過期時間并返回

--> 存在檢查uuid+線程id是否一致,一致遞增value更新過期時間返回。存在鎖檢查uuid+線程id不一致,判斷是否到期,沒到期我就幫你續(xù)期,自己加鎖也沒有成功,就以當(dāng)前業(yè)務(wù)key發(fā)布消息訂閱pubsub,等收到解鎖消息在重試

  • 解鎖邏輯

lua判斷鎖是否存在

-->不存在則直接發(fā)布解鎖消息并返回

-->存在就檢查uuid+線程id是否一致,不一致就報錯,因?yàn)榧渔i線程不一致。如果一致,就遞減value,判斷是否大于0,如果等于0,刪除key并發(fā)布解鎖消息

以上就是redisson特性及優(yōu)雅實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于redisson特性及實(shí)現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)按行讀取大文件

    Java實(shí)現(xiàn)按行讀取大文件

    這篇文章主要介紹了Java實(shí)現(xiàn)按行讀取大文件的方法的小結(jié),非常的簡單實(shí)用,有需要的小伙伴尅參考下。
    2015-05-05
  • java日期操作工具類(獲取指定日期、日期轉(zhuǎn)換、相隔天數(shù))

    java日期操作工具類(獲取指定日期、日期轉(zhuǎn)換、相隔天數(shù))

    這篇文章主要為大家詳細(xì)介紹了java日期操作工具類,包括獲取指定日期、日期轉(zhuǎn)換、相隔天數(shù)等操作,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Spring Security登陸流程講解

    Spring Security登陸流程講解

    本文主要介紹了Spring Security登陸流程講解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Springboot+Thymeleaf+Jpa實(shí)現(xiàn)登錄功能(附源碼)

    Springboot+Thymeleaf+Jpa實(shí)現(xiàn)登錄功能(附源碼)

    最近有學(xué)習(xí)到關(guān)于Springboot+Thymeleaf+Jpa的綜合運(yùn)用知識,因此想寫一個簡單的登錄界面來嘗試一下,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Tornadofx學(xué)習(xí)筆記之IconTextFx開源庫整合5000+個字體圖標(biāo)

    Tornadofx學(xué)習(xí)筆記之IconTextFx開源庫整合5000+個字體圖標(biāo)

    這篇文章主要介紹了Tornadofx學(xué)習(xí)筆記之IconTextFx開源庫整合5000+個字體圖標(biāo)的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Spring的@Scheduled 如何動態(tài)更新cron表達(dá)式

    Spring的@Scheduled 如何動態(tài)更新cron表達(dá)式

    這篇文章主要介紹了Spring的@Scheduled 如何動態(tài)更新cron表達(dá)式的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java matches類,Pattern類及matcher類用法示例

    Java matches類,Pattern類及matcher類用法示例

    這篇文章主要介紹了Java matches類,Pattern類及matcher類用法,結(jié)合實(shí)例形式分析了java matches類,Pattern類及matcher類針對字符串常見操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • mybatis類型處理器JSR310標(biāo)準(zhǔn)詳解

    mybatis類型處理器JSR310標(biāo)準(zhǔn)詳解

    這篇文章主要介紹了mybatis類型處理器JSR310標(biāo)準(zhǔn)詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java實(shí)現(xiàn)TCP和UDP協(xié)議詳解

    Java實(shí)現(xiàn)TCP和UDP協(xié)議詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)TCP和UDP協(xié)議詳解,TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)是兩種最常用的傳輸層協(xié)議,它們都用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù),但是它們之間有很多不同之處,需要的朋友可以參考下
    2023-07-07
  • 如何基于Java實(shí)現(xiàn)對象List排序

    如何基于Java實(shí)現(xiàn)對象List排序

    這篇文章主要介紹了如何基于Java實(shí)現(xiàn)對象List排序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論

江北区| 安仁县| 老河口市| 库尔勒市| 南康市| 长岛县| 兰溪市| 瓦房店市| 铁力市| 吴桥县| 延边| 仁怀市| 华容县| 霍山县| 阜城县| 昌宁县| 建阳市| 南投市| 兰考县| 康保县| 九龙城区| 师宗县| 桐乡市| 平谷区| 灌阳县| 隆化县| 宁陵县| 疏勒县| 长乐市| 平罗县| 荣成市| 洛扎县| 芮城县| 修水县| 灵川县| 永仁县| 深泽县| 温州市| 新郑市| 英德市| 内江市|