婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Redisson實現Redis分布式鎖的幾種方式

Redisson實現Redis分布式鎖的幾種方式

熱門標簽:機器人外呼系統軟件存在問題 南京400電話怎樣辦理 高德地圖標注商戶位置 企業智能外呼系統價格多少 兗州電話外呼營銷系統 福州電銷機器人源代碼 徐州ai電銷機器人原理 沈陽營銷電銷機器人招商 智能電銷機器人銷售話術

前幾天發的一篇文章《Redlock:Redis分布式鎖最牛逼的實現》,引起了一些同學的討論,也有一些同學提出了一些疑問,這是好事兒。本文在講解如何使用Redisson實現Redis普通分布式鎖,以及Redlock算法分布式鎖的幾種方式的同時,也附帶解答這些同學的一些疑問。

Redis幾種架構

Redis發展到現在,幾種常見的部署架構有:

  • 單機模式;
  • 主從模式;
  • 哨兵模式;
  • 集群模式;

我們首先基于這些架構講解Redisson普通分布式鎖實現,需要注意的是,只有充分了解普通分布式鎖是如何實現的,才能更好的了解Redlock分布式鎖的實現,因為Redlock分布式鎖的實現完全基于普通分布式鎖。

普通分布式鎖

Redis普通分布式鎖這個大家基本上只了解,本文不打算過多的介紹,上一篇文章《Redlock:Redis分布式鎖最牛逼的實現》也講的很細,并且也說到了幾個重要的注意點。

所以直接show you the code,畢竟talk is cheap。

redisson版本

本次測試選擇redisson 2.14.1版本。

單機模式

源碼如下:

// 構造redisson實現分布式鎖必要的Config
Config config = new Config();
config.useSingleServer().setAddress("redis://172.29.1.180:5379").setPassword("a123456").setDatabase(0);
// 構造RedissonClient
RedissonClient redissonClient = Redisson.create(config);
// 設置鎖定資源名稱
RLock disLock = redissonClient.getLock("DISLOCK");
boolean isLock;
try {
    //嘗試獲取分布式鎖
    isLock = disLock.tryLock(500, 15000, TimeUnit.MILLISECONDS);
    if (isLock) {
        //TODO if get lock success, do something;
        Thread.sleep(15000);
    }
} catch (Exception e) {
} finally {
    // 無論如何, 最后都要解鎖
    disLock.unlock();
}

通過代碼可知,經過Redisson的封裝,實現Redis分布式鎖非常方便,我們再看一下Redis中的value是啥,和前文分析一樣,hash結構,key就是資源名稱,field就是UUID+threadId,value就是重入值,在分布式鎖時,這個值為1(Redisson還可以實現重入鎖,那么這個值就取決于重入次數了):

172.29.1.180:5379> hgetall DISLOCK
1) "01a6d806-d282-4715-9bec-f51b9aa98110:1"
2) "1"

哨兵模式

即sentinel模式,實現代碼和單機模式幾乎一樣,唯一的不同就是Config的構造:

Config config = new Config();
config.useSentinelServers().addSentinelAddress(
        "redis://172.29.3.245:26378","redis://172.29.3.245:26379", "redis://172.29.3.245:26380")
        .setMasterName("mymaster")
        .setPassword("a123456").setDatabase(0);


集群模式

集群模式構造Config如下:

Config config = new Config();
config.useClusterServers().addNodeAddress(
        "redis://172.29.3.245:6375","redis://172.29.3.245:6376", "redis://172.29.3.245:6377",
        "redis://172.29.3.245:6378","redis://172.29.3.245:6379", "redis://172.29.3.245:6380")
        .setPassword("a123456").setScanInterval(5000);

總結

普通分布式實現非常簡單,無論是那種架構,向Redis通過EVAL命令執行LUA腳本即可。

Redlock分布式鎖

那么Redlock分布式鎖如何實現呢?以單機模式Redis架構為例,直接看實現代碼:

Config config1 = new Config();
config1.useSingleServer().setAddress("redis://172.29.1.180:5378")
        .setPassword("a123456").setDatabase(0);
RedissonClient redissonClient1 = Redisson.create(config1);

Config config2 = new Config();
config2.useSingleServer().setAddress("redis://172.29.1.180:5379")
        .setPassword("a123456").setDatabase(0);
RedissonClient redissonClient2 = Redisson.create(config2);

Config config3 = new Config();
config3.useSingleServer().setAddress("redis://172.29.1.180:5380")
        .setPassword("a123456").setDatabase(0);
RedissonClient redissonClient3 = Redisson.create(config3);

String resourceName = "REDLOCK";
RLock lock1 = redissonClient1.getLock(resourceName);
RLock lock2 = redissonClient2.getLock(resourceName);
RLock lock3 = redissonClient3.getLock(resourceName);

RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);
boolean isLock;
try {
    isLock = redLock.tryLock(500, 30000, TimeUnit.MILLISECONDS);
    System.out.println("isLock = "+isLock);
    if (isLock) {
        //TODO if get lock success, do something;
        Thread.sleep(30000);
    }
} catch (Exception e) {
} finally {
    // 無論如何, 最后都要解鎖
    System.out.println("");
    redLock.unlock();
}

最核心的變化就是RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);,因為我這里是以三個節點為例。

那么如果是哨兵模式呢?需要搭建3個,或者5個sentinel模式集群(具體多少個,取決于你)。
那么如果是集群模式呢?需要搭建3個,或者5個cluster模式集群(具體多少個,取決于你)。

實現原理

既然核心變化是使用了RedissonRedLock,那么我們看一下它的源碼有什么不同。這個類是RedissonMultiLock的子類,所以調用tryLock方法時,事實上調用了RedissonMultiLock的tryLock方法,精簡源碼如下:

public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
    // 實現要點之允許加鎖失敗節點限制
    int failedLocksLimit = failedLocksLimit();
    ListRLock> acquiredLocks = new ArrayListRLock>(locks.size());
    // 實現要點之遍歷所有節點通過EVAL命令執行lua加鎖
    for (ListIteratorRLock> iterator = locks.listIterator(); iterator.hasNext();) {
        RLock lock = iterator.next();
        boolean lockAcquired;
        try {
            // 對節點嘗試加鎖
            lockAcquired = lock.tryLock(awaitTime, newLeaseTime, TimeUnit.MILLISECONDS);
        } catch (RedisConnectionClosedException|RedisResponseTimeoutException e) {
            // 如果拋出這類異常,為了防止加鎖成功,但是響應失敗,需要解鎖
            unlockInner(Arrays.asList(lock));
            lockAcquired = false;
        } catch (Exception e) {
            // 拋出異常表示獲取鎖失敗
            lockAcquired = false;
        }
        
        if (lockAcquired) {
            // 成功獲取鎖集合
            acquiredLocks.add(lock);
        } else {
            // 如果達到了允許加鎖失敗節點限制,那么break,即此次Redlock加鎖失敗
            if (locks.size() - acquiredLocks.size() == failedLocksLimit()) {
                break;
            }               
        }
    }
    return true;
}

很明顯,這段源碼就是上一篇文章《Redlock:Redis分布式鎖最牛逼的實現》提到的Redlock算法的完全實現。

以sentinel模式架構為例,如下圖所示,有sentinel-1,sentinel-2,sentinel-3總計3個sentinel模式集群,如果要獲取分布式鎖,那么需要向這3個sentinel集群通過EVAL命令執行LUA腳本,需要3/2+1=2,即至少2個sentinel集群響應成功,才算成功的以Redlock算法獲取到分布式鎖:


問題合集

根據上面實現原理的分析,這位同學應該是對Redlock算法實現有一點點誤解,假設我們用5個節點實現Redlock算法的分布式鎖。那么要么是5個redis單實例,要么是5個sentinel集群,要么是5個cluster集群。而不是一個有5個主節點的cluster集群,然后向每個節點通過EVAL命令執行LUA腳本嘗試獲取分布式鎖,如上圖所示。

失效時間如何設置
這個問題的場景是,假設設置失效時間10秒,如果由于某些原因導致10秒還沒執行完任務,這時候鎖自動失效,導致其他線程也會拿到分布式鎖。

這確實是Redis分布式最大的問題,不管是普通分布式鎖,還是Redlock算法分布式鎖,都沒有解決這個問題。也有一些文章提出了對失效時間續租,即延長失效時間,很明顯這又提升了分布式鎖的復雜度。另外就筆者了解,沒有現成的框架有實現,如果有哪位知道,可以告訴我,萬分感謝。

redis分布式鎖的高可用
關于Redis分布式鎖的安全性問題,在分布式系統專家Martin Kleppmann和Redis的作者antirez之間已經發生過一場爭論。有興趣的同學,搜索"基于Redis的分布式鎖到底安全嗎"就能得到你想要的答案,需要注意的是,有上下兩篇(這應該就是傳說中的神仙打架吧,哈)。

zookeeper or redis
沒有絕對的好壞,只有更適合自己的業務。就性能而言,redis很明顯優于zookeeper;就分布式鎖實現的健壯性而言,zookeeper很明顯優于redis。如何選擇,取決于你的業務!

到此這篇關于Redisson實現Redis分布式鎖的幾種方式的文章就介紹到這了,更多相關Redisson實現Redis分布式鎖內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Redis分布式限流組件設計與使用實例
  • Java面試題沖刺第二十三天--分布式
  • Redis分布式鎖Redlock的實現
  • Redis分布式非公平鎖的使用
  • C#實現Redis的分布式鎖
  • java基于mongodb實現分布式鎖的示例代碼
  • 支持python的分布式計算框架Ray詳解
  • LCN分布式事務解決方案詳解

標簽:吉安 邯鄲 鶴崗 本溪 昭通 丹東 大理 景德鎮

巨人網絡通訊聲明:本文標題《Redisson實現Redis分布式鎖的幾種方式》,本文關鍵詞  Redisson,實現,Redis,分布式,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redisson實現Redis分布式鎖的幾種方式》相關的同類信息!
  • 本頁收集關于Redisson實現Redis分布式鎖的幾種方式的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91亚洲永久精品| 777午夜精品免费视频| 欧美日韩一区中文字幕| 久久噜噜亚洲综合| 国产精品白丝jk白祙喷水网站| 一本色道综合亚洲| 亚洲成人激情社区| 夫妻av一区二区| 日韩精品1区2区3区| 亚洲国产精品传媒在线观看| 欧美成人三级电影在线| 69堂精品视频| 91在线精品一区二区三区| 国产一区视频导航| 久久亚洲一级片| 综合在线观看色| 亚洲精品国产第一综合99久久| 美女尤物国产一区| 99久久久国产精品免费蜜臀| 欧美二区三区的天堂| 懂色一区二区三区免费观看| 麻豆91免费看| 久久久一区二区三区捆绑**| 911精品产国品一二三产区| 99久久精品免费观看| 亚洲成人你懂的| 欧美激情一区二区三区在线| 欧美日韩激情一区二区| 91国内精品野花午夜精品| 国产精品系列在线观看| 久久激情五月激情| 亚洲1区2区3区视频| 日一区二区三区| 日韩精品一级二级| 香蕉影视欧美成人| 亚洲综合色在线| 国产婷婷色一区二区三区在线| 精品国产1区二区| 精品国产免费久久| 欧美一区二区三区视频在线| 99re亚洲国产精品| 久久精品国产99国产精品| 亚洲国产毛片aaaaa无费看| 亚洲成人激情综合网| 五月激情综合婷婷| 日本一区中文字幕| 欧美日韩国产免费| 在线观看91av| 精品国产成人在线影院| 精品国产sm最大网站| 亚洲欧洲av在线| 亚州成人在线电影| 国产精品资源站在线| 在线免费观看日本一区| 日韩亚洲欧美在线观看| 精品国产乱码久久久久久影片| 色94色欧美sute亚洲线路一久| 69堂国产成人免费视频| 亚洲一区二区三区在线看| 免费精品视频在线| 一本大道久久精品懂色aⅴ| 日韩午夜中文字幕| 欧美精品乱码久久久久久按摩| 日本一区二区成人| 奇米在线7777在线精品| 欧美一区二区三区免费大片| 午夜在线电影亚洲一区| 激情国产一区二区| 欧美老年两性高潮| 人人爽香蕉精品| 欧美日韩在线免费视频| 亚洲欧美激情插| 欧美色综合久久| 一区二区三区欧美亚洲| 欧美精品欧美精品系列| 国产精品久久精品日日| 成人精品一区二区三区中文字幕| 国产欧美视频一区二区三区| 国产精品 日产精品 欧美精品| 日韩一卡二卡三卡国产欧美| 久久成人久久鬼色| 国产在线一区观看| 日韩亚洲欧美一区二区三区| 韩日精品视频一区| 综合精品久久久| 在线观看日韩毛片| 亚洲电影在线免费观看| 色94色欧美sute亚洲线路二| 喷水一区二区三区| 日本91福利区| av亚洲精华国产精华| 欧美国产一区在线| 亚洲视频综合在线| 亚洲国产经典视频| 久久男人中文字幕资源站| 欧美日韩色一区| 欧美精品黑人性xxxx| 欧美日韩在线直播| 日韩一区二区视频在线观看| 一本到高清视频免费精品| 国产suv精品一区二区三区| 日本伊人午夜精品| 亚洲成人在线观看视频| 无码av免费一区二区三区试看| 亚洲天堂2014| 亚洲高清免费视频| 亚洲综合视频在线观看| 亚洲欧美韩国综合色| 亚洲欧美aⅴ...| 亚洲欧美日韩一区二区| 欧美a一区二区| 国产高清精品在线| 欧美性xxxxxx少妇| 欧美日韩国产高清一区二区| 538prom精品视频线放| 国产精品美女久久久久aⅴ国产馆| 国产亚洲欧美色| 亚洲欧美视频一区| 日韩电影在线观看一区| 国产呦精品一区二区三区网站| eeuss影院一区二区三区| 国产盗摄视频一区二区三区| 色综合夜色一区| 欧美日韩高清一区二区| 欧美日韩成人综合天天影院| 精品国产露脸精彩对白| 亚洲精品乱码久久久久久久久 | 国产精品资源网站| 不卡av在线网| 欧美日韩欧美一区二区| 亚洲私人黄色宅男| 91啪亚洲精品| 国产校园另类小说区| 午夜a成v人精品| 欧美综合亚洲图片综合区| 中文字幕不卡在线观看| 卡一卡二国产精品 | 欧美日韩国产综合草草| 亚洲综合成人在线| 丁香婷婷深情五月亚洲| 久久―日本道色综合久久| 色综合久久久久综合99| 亚洲视频在线观看三级| 色婷婷av一区二区三区大白胸 | 国产精品国产三级国产三级人妇| 五月天亚洲婷婷| 精品电影一区二区三区| 国产一区高清在线| 中文字幕免费在线观看视频一区| 成人av网址在线观看| 亚洲裸体xxx| 欧美在线影院一区二区| 亚洲成人免费视| 久久av资源站| 久久这里只有精品6| 色综合久久久网| 午夜国产精品影院在线观看| 欧美精品久久久久久久多人混战| 玖玖九九国产精品| 亚洲欧美日韩一区| 久久久久国产免费免费| 久久伊99综合婷婷久久伊| 亚洲日本乱码在线观看| 国产一区二区视频在线| 国产精品 欧美精品| 久久久国产午夜精品| 在线精品视频免费观看| 亚洲国产视频网站| 久久麻豆一区二区| 欧美福利一区二区| 不卡av在线免费观看| 亚洲一区二区三区在线看| 久久精品水蜜桃av综合天堂| 成人国产精品免费观看| 丝袜亚洲另类欧美| 精品国产免费一区二区三区四区 | 99久久免费国产| 丝袜亚洲另类丝袜在线| 欧美国产日韩一二三区| 在线不卡a资源高清| 欧美精品精品一区| 9人人澡人人爽人人精品| 国产成人夜色高潮福利影视| 久久99久久99精品免视看婷婷| 亚洲久草在线视频| 日本系列欧美系列| 国内国产精品久久| 成人一区二区三区视频 | 国产电影精品久久禁18| 国产经典欧美精品| 99久久精品免费看国产| 成人免费看片app下载| 91福利资源站| 日韩女优毛片在线| 亚洲一二三区不卡| 麻豆精品久久精品色综合| av不卡一区二区三区| 欧美视频在线不卡| 亚洲va国产va欧美va观看| 麻豆成人av在线|