精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個Redis分布式鎖的實現引發的思考

數據庫 Redis
釋放鎖時,會通過 UUID 去判斷這個鎖的值,避免釋放其他線程加的鎖,但是沒有考慮到這個 get 和 del 是兩個操作,還是會有意外,比如 releaseLock 時,執行完 get ,判斷這個 uuid 是自己的,準備刪除,但此時 鎖過期 了,其他線程剛好加鎖成功,結果又被你刪除了。

最近看了一個老項目(2018年的),發現其中用 Redis 來實現分布式鎖??。

代碼如下 ??

// jedis 

public String lock(String lockName, long acquireTimeout) {
    return lockWithTimeout(lockName, acquireTimeout, DEFAULT_EXPIRE);
}

public String lockWithTimeout(String lockName, long acquireTimeout, long timeout) {

        RedisConnectionFactory connectionFactory = redisTemplate.getConnectionFactory();
        RedisConnection redisConnection = connectionFactory.getConnection();
        /** 隨機生成一個value */
        String identifier = UUID.randomUUID().toString();
        String lockKey = LOCK_PREFIX + lockName;
        int lockExpire = (int) (timeout / 1000);

        long end = System.currentTimeMillis() + acquireTimeout;    /** 獲取鎖的超時時間,超過這個時間則放棄獲取鎖 */
        while (System.currentTimeMillis() < end) {
            if (redisConnection.setNX(lockKey.getBytes(), identifier.getBytes())) {
                redisConnection.expire(lockKey.getBytes(), lockExpire);
                /** 獲取鎖成功,返回標識鎖的value值,用于釋放鎖確認 */
                RedisConnectionUtils.releaseConnection(redisConnection, connectionFactory);
                return identifier;
            }
            /** 返回-1代表key沒有設置超時時間,為key設置一個超時時間 */
            if (redisConnection.ttl(lockKey.getBytes()) == -1) {
                redisConnection.expire(lockKey.getBytes(), lockExpire);
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                log.warn("獲取分布式鎖:線程中斷!");
                Thread.currentThread().interrupt();
            }
        }
        RedisConnectionUtils.releaseConnection(redisConnection, connectionFactory);
        return null;
    }

public boolean releaseLock(String lockName, String identifier) {

    if (StringUtils.isEmpty(identifier)) return false;

    RedisConnectionFactory connectionFactory = redisTemplate.getConnectionFactory();
    RedisConnection redisConnection = connectionFactory.getConnection();
    String lockKey = LOCK_PREFIX + lockName;
    boolean releaseFlag = false;
    while (true) {
        try {
            byte[] valueBytes = redisConnection.get(lockKey.getBytes());

            /**  value為空表示鎖不存在或已經被釋放*/
            if (valueBytes == null) {
                releaseFlag = false;
                break;
            }

            /** 通過前面返回的value值判斷是不是該鎖,若是該鎖,則刪除,釋放鎖 */
            String identifierValue = new String(valueBytes);
            if (identifier.equals(identifierValue)) {
                redisConnection.del(lockKey.getBytes());
                releaseFlag = true;
            }
            break;
        } catch (Exception e) {
            log.warn("釋放鎖異常", e);
        }
    }
    RedisConnectionUtils.releaseConnection(redisConnection, connectionFactory);
    return releaseFlag;
}


public void lockTest(String lockName, Long acquireTimeout, CouponSummary couponSummary)  {

    String lockIdentify = redisLock.lock(lockName,acquireTimeout);
    if (StringUtils.isNotEmpty(lockIdentify)){
        // 業務代碼
        redisLock.releaseLock(lockName, lockIdentify);
    }
    else{
        System.out.println("get lock failed.");
    }

}

分析

看完之后,有這幾點感悟

  1. setNX 和 expire 兩個操作是分開的,有一定的風險(忘了釋放鎖,expire 失敗)
  2. 加鎖時,除了 setNX ,還會去 ttl ,防止死鎖的發生。
  3. 釋放鎖時,會通過 UUID 去判斷這個鎖的值,避免釋放其他線程加的鎖,但是沒有考慮到這個 get 和 del 是兩個操作,還是會有意外,比如 releaseLock 時,執行完 get ,判斷這個 uuid 是自己的,準備刪除,但此時 鎖過期 了,其他線程剛好加鎖成功,結果又被你刪除了。
  4. 釋放鎖時沒有在 finally 塊中執行
  5. 獲取不到鎖時,嘗試自旋等待鎖

再結合 redisson 框架來看的話,就會發現

  1. 少了 自動續期 的功能,如果業務執行時間較長,鎖過期釋放掉了,就可能出現并發問題。
  2. 少了 可重入鎖 的功能,可以預見獲取鎖的線程,再次去加鎖也會失敗。
  3. 少了 lua腳本 ,lua 腳本能保證原子性操作,減少這個網絡開銷。

再把視角移到 Redis 服務器來,就會發現 單點問題 的存在,此時分布式鎖就無法使用了。

這個問題可以通過 主從,哨兵,集群 模式解決,但是又有了一個 故障轉移問題 。

先簡要介紹下這幾個模式

  1. Redis 主從復制模式:

一主多從,主節點負責寫,并同步到從節點。

從節點負責備份數據,處理讀操作,提供讀負載均衡和故障切換。

  1. Redis 哨兵模式:
  • 主從基礎上增加了哨兵節點(Sentinel),一個獨立進程,去監控所有節點,當主節點宕機時,會從 slave 中選舉出新的主節點,并通知其他從節點更新配置
  • 哨兵節點負責執行故障轉移、選舉新的主節點等操作
  1. Redis 集群模式:
  • 多個主從組成,由 master 去瓜分 16384 個 slot, 將數據分片存儲在多個節點上。
  • 節點間通過 Gossip 協議進行廣播通信,比如 新節點的加入,主從變更等

回到 分布式鎖 這個話題,通過主從切換,可以實現故障轉移。但是當加鎖成功時,master 掛了,此時還沒同步鎖信息到這個 slave 上,那這個分布式鎖也是失效了。

網上的方案是通過  Redlock(紅鎖) 來解決。

Redlock 的大致意思就是給多個節點加鎖,超過半數成功的話,就認為加鎖成功。

redisson 的紅鎖用法??

RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");

RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
// 同時加鎖:lock1 lock2 lock3
// 紅鎖在大部分節點上加鎖成功就算成功。
lock.lock();
...
lock.unlock();

我更偏向于解決這個 主從復制延遲 的問題,比如

  • 升級硬件,更好的 CPU,帶寬
  • 避免從節點阻塞,比如操作一些 大Key
  • 調大 repl_backlog_size 參數,避免全量同步

當然,具體問題具體分析,可以根據業務準備補償措施,但也要避免這個過度設計。

紅鎖爭論

在查閱資料時,看到了這么一個事情 ??

《數據密集型應用系統設計》的作者 Martin 去反駁這個 Redlock ,并用一個進程暫停(GC)的例子,指出了 Redlock 安全性問題:

  1. 客戶端 1 請求鎖定節點 A、B、C、D、E
  2. 客戶端 1 的拿到鎖后,進入 GC(時間比較久)
  3. 所有 Redis 節點上的鎖都過期了
  4. 客戶端 2 獲取到了 A、B、C、D、E 上的鎖
  5. 客戶端 1 GC 結束,認為成功獲取鎖
  6. 客戶端 2 也認為獲取到了鎖,發生「沖突」

圖片圖片

還有 時鐘 漂移的問題

這里我就不過多 CV 了,可以看看原文??

相關文章

《一文講透Redis分布式鎖安全問題》:https://cloud.tencent.com/developer/article/2332108

《How to do distributed locking》https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html

NPC 異常場景

  • N:Network Delay,網絡延遲
  • P:Process Pause,進程暫停(GC)
  • C:Clock Drift,時鐘漂移
責任編輯:武曉燕 來源: Java4ye
相關推薦

2020-07-30 09:35:09

Redis分布式鎖數據庫

2021-11-01 12:25:56

Redis分布式

2022-04-14 07:56:30

公平鎖Java線程

2024-02-19 00:00:00

Redis分布式

2019-06-19 15:40:06

分布式鎖RedisJava

2024-07-15 08:25:07

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數據分布式鎖

2022-09-22 13:28:34

Redis分布式鎖

2022-09-29 08:28:57

SpringRedis分布式

2023-03-01 08:07:51

2020-05-12 14:03:51

RedisZooKeeper分布式鎖

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2022-12-18 20:07:55

Redis分布式

2024-11-28 15:11:28

2023-10-11 09:37:54

Redis分布式系統

2023-09-21 22:22:51

開發分布式鎖

2024-10-07 10:07:31

2022-11-11 08:19:03

redis分布式

2019-12-25 14:35:33

分布式架構系統
點贊
收藏

51CTO技術棧公眾號

欧美日韩免费在线观看| 成人av网站免费观看| 色哟哟网站入口亚洲精品| 国产裸体免费无遮挡| 1769在线观看| 国产999精品久久久久久| 91a在线视频| 国产又粗又长又黄的视频| 精品国产亚洲一区二区在线观看| 亚洲福利视频一区| 日韩av在线一区二区三区| 亚洲一卡二卡在线观看| 亚洲成人在线| 一区二区三区四区视频| 国产伦精品一区二区三区妓女下载| 成年人视频免费在线播放| 久久精品一区蜜桃臀影院| 成人网在线观看| 国产又大又黑又粗免费视频| 欧美一级精品| 亚洲精品一区二区三区香蕉| xx欧美撒尿嘘撒尿xx| 波多野结衣中文字幕久久| 中文一区在线播放| 国产精品国产三级欧美二区| 在线免费av网| 国产精品毛片在线| 久久99热精品| 黑人と日本人の交わりビデオ| 澳门精品久久国产| 欧美日韩一本到| 可以免费观看av毛片| 欧美另类tv| 中文字幕在线免费不卡| 青青草久久网络| 免费观看国产精品| 国产一区二区调教| 国产精品极品在线| 天天干天天色综合| 99视频精品| 九九热精品在线| 亚洲综合久久av一区二区三区| 欧美日本成人| 亚洲福利视频在线| 少妇伦子伦精品无吗| 国产精品白丝久久av网站| 色综合久久久久综合体| 国产乱子伦农村叉叉叉| 美女网站视频在线| 亚洲精品福利视频网站| 性做爰过程免费播放| 在线观看麻豆| 国产精品欧美精品| 亚洲砖区区免费| 国产一级在线观看| 国产欧美久久久精品影院| 欧美男人的天堂| 男女网站在线观看| www一区二区| 久久国产精品高清| 青青草观看免费视频在线| 成人高清免费观看| 久久99精品久久久久久久青青日本 | 欧美激情视频网址| 欧美精品99久久久| 欧美三级黄美女| 久久久久久国产| 日本在线视频中文字幕| 亚洲精品黄色| 欧美专区福利在线| 国产无遮挡又黄又爽又色视频| 日韩国产精品91| 国产精品一区二区性色av| 中文字幕在线2018| 国产一区二区导航在线播放| 亚洲最大激情中文字幕| 亚洲乱码国产乱码精品精软件| 成人免费看的视频| 久久久久欧美| 日韩在线免费电影| 亚洲欧美日韩成人高清在线一区| 国产精品日韩三级| 精品丝袜在线| 欧美三级乱人伦电影| 国产xxxxhd| 天堂成人娱乐在线视频免费播放网站| 亚洲最大在线视频| 精品自拍偷拍视频| 国产精品日韩久久久| 国产女精品视频网站免费| 国产叼嘿视频在线观看| 久久久久久9999| 午夜啪啪免费视频| 国产黄色大片在线观看| 在线视频一区二区三区| 亚洲性图第一页| 精品国产91久久久久久浪潮蜜月| 久久国产精品影视| 伦av综合一区| 国产成人在线观看| 日韩在线第一区| 春色校园综合激情亚洲| 欧美日韩日日骚| 久久久午夜精品福利内容| 久久久影院免费| 午夜精品久久久久久久99热浪潮| 亚洲无码精品国产| 99久久综合99久久综合网站| 一区二区三区四区欧美| 丝袜诱惑一区二区| 在线不卡中文字幕播放| 99re久久精品国产| 婷婷成人综合| 久久久国产一区二区| 日韩乱码在线观看| 水蜜桃久久夜色精品一区的特点| 91香蕉视频在线下载| 日本在线丨区| 亚洲精选免费视频| 爱福利视频一区二区| 国产精品麻豆| 亚洲美女免费精品视频在线观看| 糖心vlog免费在线观看| 国产乱码精品| 亚洲在线www| 久蕉在线视频| 亚洲欧美综合色| 日韩欧美在线播放视频| 日韩欧美另类中文字幕| 日韩视频免费在线| 视频一区二区三区四区五区| 国产福利精品导航| 秋霞毛片久久久久久久久| 18videosex性欧美麻豆| 欧美日韩一二三区| 国产高清成人久久| 影音先锋亚洲精品| 91最新在线免费观看| 国产片在线观看| 亚洲aaa精品| 自拍一级黄色片| 色一区二区三区四区| 韩国日本不卡在线| www.久久综合| 综合欧美一区二区三区| 黄色成人免费看| 精品欠久久久中文字幕加勒比| 久久精品视频亚洲| 中文永久免费观看| 成人毛片老司机大片| 日韩视频 中文字幕| 中文字幕成人| 日韩中文字幕在线免费观看| 国产中文字幕视频| 久久青草欧美一区二区三区| 99久久久精品视频| 色吊丝一区二区| 久久久亚洲精选| 黄色一级a毛片| 亚洲午夜精品网| 人妻巨大乳一二三区| 色天天久久综合婷婷女18| 国产在线观看91精品一区| 成人影院免费观看| 在线观看欧美黄色| 精品人伦一区二区三电影| 日日摸夜夜添夜夜添精品视频| 久久艳妇乳肉豪妇荡乳av| 3344国产永久在线观看视频| 日韩视频在线观看一区二区| 欧美日韩综合一区二区| 国产精品一级在线| 999久久欧美人妻一区二区| 精品一区二区三区在线观看视频 | 91久久在线观看| 里番在线观看网站| 欧美日韩综合在线免费观看| 99自拍视频在线| 国产精品一区二区在线播放| 成人短视频在线观看免费| 日韩一区二区三区高清在线观看| 欧美激情国产日韩精品一区18| 老司机午夜福利视频| 精品久久久精品| 久久精品国产亚洲av久| 美女脱光内衣内裤视频久久网站| 一区二区三区在线视频111| www.91精品| 欧美精品videosex极品1| 亚洲精品国产精品国| 色综合久久66| 亚洲女同二女同志奶水| 国产乱人伦精品一区二区在线观看 | 欧美激情久久久久久| 三级视频在线| 在线观看中文字幕不卡| 国产人与禽zoz0性伦| 国产精品一区二区男女羞羞无遮挡| 欧洲精品在线播放| 国产精品美女久久久久久不卡 | 亚洲一区三区在线观看| 伊色综合久久之综合久久| 性视频1819p久久| 可以在线观看的黄色| 制服丝袜在线91| 国产精品成人免费一区二区视频| 国产精品免费视频网站| 成人一区二区三区仙踪林| 天堂在线一区二区| 亚洲天堂第一区| 亚洲婷婷影院| 国产精品久久久久7777婷婷| 三级资源在线| 一本色道久久88精品综合| 国产成人精品无码高潮| 欧美日韩亚洲精品内裤| 永久免费未视频| 成人av午夜电影| 在线视频观看91| 午夜影院日韩| 粉嫩av一区二区三区天美传媒| 天堂俺去俺来也www久久婷婷| 91人成网站www| 欧美成a人片在线观看久| 欧美高清无遮挡| 中文字幕在线播放| 日韩二区三区在线| 精品久久久久中文慕人妻| 欧美日韩综合在线| 中文字幕+乱码+中文字幕明步| 亚洲一区二区三区免费视频| 91香蕉国产视频| 久久一区二区三区四区| 日本wwww色| 日韩国产欧美在线观看| 日韩精品视频一区二区在线观看| 欧美日韩18| 午夜欧美一区二区三区免费观看| 久久草在线视频| av观看久久| 色综合视频一区二区三区日韩| 国产成人综合一区二区三区| 色多多在线观看| 国内精品免费午夜毛片| av网站大全在线| 最新中文字幕亚洲| 韩国中文字幕2020精品| 亚洲高清色综合| 亚洲免费不卡视频| 日韩欧美一区在线| 国产三级视频在线播放| 欧美一区二区三区视频在线| 国产一区二区三区成人| 欧美色综合影院| 国产伦精品一区二区三区视频网站| 亚洲第一在线综合网站| 神马午夜精品91| 亚洲精品免费一二三区| 欧美日韩精品亚洲精品| 亚洲欧美区自拍先锋| 青花影视在线观看免费高清| 国产精品久久久久四虎| 婷婷伊人五月天| 亚洲人成影院在线观看| 天天做夜夜爱爱爱| 亚洲精品国产成人久久av盗摄| 欧美做爰爽爽爽爽爽爽| 成人免费一区二区三区在线观看| 一起操在线播放| 亚洲男人天堂一区| 农村黄色一级片| 亚洲影院理伦片| 在线观看精品国产| 富二代精品短视频| 伦av综合一区| 欧美色涩在线第一页| 亚洲无码久久久久| 欧美一区二区网站| 亚洲国产日韩在线观看| 亚洲成人激情在线观看| 天堂在线资源8| 亚洲欧洲视频在线| 免费在线观看av| 欧美寡妇偷汉性猛交| 嗯~啊~轻一点视频日本在线观看| 777精品视频| 欧美free嫩15| 波多野结衣一区二区三区在线观看| 99re8这里有精品热视频8在线| 国产专区一区二区| 国产中文精品久高清在线不| 亚洲福利av在线| 国产精品vip| 国产熟女高潮视频| 韩日av一区二区| 日韩少妇一区二区| 国产欧美一区二区精品性色| 精品97人妻无码中文永久在线| 天天综合网天天综合色| 久久久久久av无码免费看大片| 日韩欧美在线网站| 日本精品专区| 欧美日本黄视频| 一本大道色婷婷在线| 91久久精品国产91久久| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 国产黄a三级三级| 一区二区三区精密机械公司| 天天干天天操天天操| 日韩一卡二卡三卡| 日韩电影免费| 欧美成人手机在线| 综合毛片免费视频| 亚洲精品欧美一区二区三区| 欧美重口另类| 欧美性受黑人性爽| 噜噜噜躁狠狠躁狠狠精品视频| 高清在线观看免费| 高清国产一区二区三区| 国产三级黄色片| 婷婷六月综合网| 国产精品一区二区av白丝下载 | 五月婷婷伊人网| 久久天天躁狠狠躁老女人| 亚洲妇女成熟| 精品视频在线观看| 亚洲最新色图| 亚洲精品视频导航| 9i在线看片成人免费| 久久99久久99精品免费看小说| 欧美视频一区在线观看| 亚洲日本国产精品| 欧美美最猛性xxxxxx| 国产情侣一区二区三区| 日韩三级电影网站| 一本综合久久| 欧美xxxx黑人| 一区在线观看视频| 成人免费视频毛片| 亚洲精品wwww| 午夜激情在线| 91久久国产精品| 久久综合88| 久久成年人网站| 国产精品三级视频| 黄色大全在线观看| 亚洲欧美日韩爽爽影院| 成人爽a毛片免费啪啪| 精品国产一区二区三区麻豆小说 | 国产精品免费一区二区三区观看 | 亚洲精品国产精品乱码不99按摩| 国产精品69xx| 国产伦精品一区二区三区免| 综合五月婷婷| 日本人dh亚洲人ⅹxx| 一区二区三区日韩精品视频| 精品人妻无码一区二区三区蜜桃一| 日韩中文字幕久久| 亚洲ww精品| 污视频在线免费观看一区二区三区| 日日夜夜精品视频天天综合网| 97人妻精品一区二区免费| 欧美日韩中文字幕综合视频| 四虎永久在线精品免费网址| 欧美壮男野外gaytube| 要久久电视剧全集免费| 欧美日韩在线视频一区二区三区| 91论坛在线播放| 亚洲熟女综合色一区二区三区| 亚洲精品视频免费在线观看| 在线成人av观看| 日本视频一区在线观看| 久久动漫亚洲| 情侣偷拍对白清晰饥渴难耐| 欧美一区二区人人喊爽| 午夜伦理大片视频在线观看| 成人情视频高清免费观看电影| 亚洲国产精品一区| 在线免费观看日韩av| 色菇凉天天综合网| 福利成人在线观看| 91精品国产高清久久久久久91裸体 | 麻豆精品国产传媒| 欧美性猛交xxxx偷拍洗澡| 国产中文在线| 国产日韩视频在线观看| 五月天久久网站| 中文乱码人妻一区二区三区视频| 黑丝美女久久久| 国产精品久久久久一区二区国产| 国产精品第10页| 在线电影一区二区| 91精品啪在线观看国产| 色综合天天综合狠狠| seseavlu视频在线| 国产日韩欧美一区二区| 日韩国产精品久久久久久亚洲| 亚洲xxxx3d动漫| 亚洲国产精品推荐| 成人短视频软件网站大全app|