精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美高清视频在线高清观看mv色露露十八 | 欧美日韩国产区| 精品久久久三级| 超碰在线观看91| 亚洲情侣在线| 亚洲第一区在线| 性刺激的欧美三级视频| caoporn免费在线| av一区二区三区四区| 国产精品91久久| 永久看片925tv| 亚洲婷婷影院| 欧美一区二区高清| 国产亚洲天堂网| 国产三区视频在线观看| 97精品久久久久中文字幕| 国产热re99久久6国产精品| 日韩中文字在线| 国产毛片久久久久久国产毛片| 五月婷婷伊人网| 卡一卡二国产精品| 91爱视频在线| 国产精品久久久久久久精| 蜜桃一区二区三区| 精品三级在线看| 五月天激情视频在线观看| 麻豆蜜桃在线| 国产精品久久久久久久久久久免费看| 国产精品香蕉视屏| 最新中文字幕第一页| 国内激情久久| 久久久成人av| 天天舔天天操天天干| 操欧美女人视频| 欧美精选在线播放| 美女黄色片视频| 三妻四妾的电影电视剧在线观看| 亚洲日本中文字幕区| 日本电影一区二区三区| 欧美 日韩 国产 成人 在线 91 | 91成人天堂久久成人| 国产探花在线免费观看| 精品国产不卡| 亚洲欧美国产一本综合首页| 日本黄色录像片| 成人黄色av网址| 日韩丝袜情趣美女图片| 国内av一区二区| 久久国内精品| 欧美午夜不卡在线观看免费| 国产女女做受ⅹxx高潮| 亚洲黄色中文字幕| 一本一道久久a久久精品综合蜜臀| 九九爱精品视频| 成年网站在线视频网站| 夜夜嗨av一区二区三区网页 | 在线成人h网| 欧美日韩国产成人在线观看| 午夜激情福利网| 最新精品国产| 欧美成在线观看| 中文字幕手机在线观看| 午夜精品视频| 欧美精品成人在线| 免费观看一区二区三区毛片| 国产视频一区免费看| 欧美亚洲成人免费| 人妻 日韩精品 中文字幕| 视频在线观看91| 国产精品99免视看9| 高潮毛片又色又爽免费| 日韩在线一区二区三区| 国产精品日韩欧美| 中文字幕 国产| 久久99精品国产麻豆不卡| 91美女片黄在线观看游戏| av中文在线观看| 成人性生交大合| 久久精品日产第一区二区三区| 色视频在线看| 国产精品高潮呻吟久久| 狠狠干视频网站| gogo高清午夜人体在线| 色噜噜狠狠色综合中国| 岛国毛片在线播放| 伊人久久影院| 国产婷婷97碰碰久久人人蜜臀| av男人的天堂av| 亚洲成av人片乱码色午夜| 欧美另类极品videosbestfree| 国产在线精品观看| 日韩高清在线一区| 91传媒视频免费| 日韩在线无毛| 亚洲视频一区在线| 午夜精品久久久久久久无码| 成人国产在线| 精品成人在线观看| 日韩一级av毛片| 午夜国产欧美理论在线播放 | 最近2019中文字幕第三页视频| 欧美日韩在线视频免费播放| 嫩草成人www欧美| 91九色单男在线观看| 深爱激情五月婷婷| 国产精品成人国产| 欧美日韩视频在线| 国产一级片自拍| 偷拍一区二区| 美女精品视频一区| 日本中文字幕第一页| 韩国av一区二区| 欧美在线一二三区| 91破解版在线观看| 欧美人与性动xxxx| 日韩av在线看免费观看| 午夜精品久久久久99热蜜桃导演| 国产不卡在线观看| 人妻va精品va欧美va| 国产精品的网站| 国产福利视频在线播放| 成人av综合网| 久久久精品一区| 亚洲精品中文字幕乱码三区91| 国产美女精品一区二区三区| 日本午夜精品一区二区三区| 麻豆免费在线| 精品少妇一区二区三区免费观看| 暗呦丨小u女国产精品| 日韩av午夜在线观看| 久久av免费一区| 99热99re6国产在线播放| 91精品欧美一区二区三区综合在| 亚洲精品乱码久久久久久久久久久久| 亚洲国产专区| 成人在线免费观看一区| 国产www.大片在线| 日本韩国一区二区三区视频| jizz欧美性20| 国产一区二区三区的电影 | 久久撸在线视频| 亚洲图区在线| 97在线观看视频国产| 999国产精品视频免费| 国产精品久久久久天堂| 亚洲一区在线不卡| 日韩一区三区| 国产欧美va欧美va香蕉在| 韩国福利在线| 欧美一a一片一级一片| 国产免费无遮挡吸奶头视频| 日韩国产精品91| 日韩精品久久久免费观看| 蜜桃视频在线观看免费视频| 亚洲高清福利视频| 青青草手机在线视频| 奇米色777欧美一区二区| 日本成人三级电影网站| 3d欧美精品动漫xxxx无尽| 日韩精品亚洲元码| 欧美亚洲精品天堂| 久久久精品tv| 日本xxxxxxx免费视频| 亚洲区小说区图片区qvod| 性欧美亚洲xxxx乳在线观看| 欧美自拍偷拍第一页| 午夜久久福利影院| 好男人香蕉影院| 亚洲黄色成人| 韩国精品一区二区三区六区色诱| 免费在线看黄色| 91精品麻豆日日躁夜夜躁| 国产又粗又猛又爽又黄的视频小说| 日产国产欧美视频一区精品| 日韩中文字幕一区二区| av3级在线| 国产一区二区日韩| 伊人久久成人网| 中文字幕综合网| 超级砰砰砰97免费观看最新一期 | 精品亚洲二区| 欧美日本亚洲视频| 日本免费一区视频| 色成人在线视频| 久久久精品成人| 久久99精品久久久久久国产越南| gogogo免费高清日本写真| 美女久久久久久| 欧美精品激情在线观看| 日本免费不卡视频| 在线亚洲人成电影网站色www| 四虎成人免费影院| 国产成人精品免费一区二区| 欧美国产视频一区| 欧美日韩一本| 国产精品久久999| 成人在线免费看黄| 日韩国产精品一区| 亚洲熟女乱色一区二区三区久久久| 亚洲男同1069视频| 黄色录像a级片| 国产一区二区电影| 男人添女荫道口图片| 欧美日韩久久精品| 成人xxxxx色| 国产黄色一区| 日韩在线免费高清视频| 青青色在线视频| 日韩色视频在线观看| 国产综合精品视频| 亚洲一区二区欧美激情| av男人的天堂av| 国产高清在线精品| 美女在线视频一区二区| 亚洲二区视频| 先锋影音网一区| ccyy激情综合| 国产精品高潮呻吟久久av黑人| 在线中文字幕第一页| 国产亚洲欧美日韩美女| 高清国产mv在线观看| 欧美日韩国产乱码电影| 欧美精品亚洲精品日韩精品| 国产精品国产成人国产三级| 成年人在线观看av| www.一区二区| xx欧美撒尿嘘撒尿xx| 久久一区二区三区超碰国产精品| 日本精品久久久久久久久久| 久久亚洲在线| 区一区二区三区中文字幕| jazzjazz国产精品久久| 91青青草免费观看| 精品69视频一区二区三区| 51ⅴ精品国产91久久久久久| 日本视频在线免费观看| 色综合亚洲精品激情狠狠| 五月天久久久久久| 日韩视频免费观看高清完整版在线观看 | 色一情一乱一伦一区二区三欧美| 亚洲一区导航| 欧美在线中文字幕| 不卡的av影片| 欧美夫妻性视频| 成人免费高清在线播放| 亚洲免费视频网站| 婷婷丁香花五月天| 日韩欧美激情四射| 国产又粗又黄又爽的视频| 欧美日韩中文字幕一区| 这里只有久久精品视频| 欧美中文字幕一区二区三区亚洲| 精人妻无码一区二区三区| 色综合久久天天| 亚洲中文字幕无码爆乳av | 麻豆成人在线视频| 亚洲欧洲精品一区二区三区| 黄色免费一级视频| 成人欧美一区二区三区小说 | 亚洲精选一二三| 黄色片在线观看网站| 最新高清无码专区| 欧美日韩色视频| 亚洲欧洲一区二区三区| 强乱中文字幕av一区乱码| 亚洲女人小视频在线观看| 91九色丨porny丨极品女神| 亚洲色图在线播放| 久久久全国免费视频| 亚洲一区二区五区| 久久激情免费视频| 亚洲成在线观看| 波多野结衣在线观看一区| 在线观看视频一区| 一区二区三区精彩视频| 欧美日韩一级视频| 性少妇videosexfreexxx片| 欧美成人三级在线| 日本黄色三级视频| 欧美tk—视频vk| 日韩精品系列| 在线a欧美视频| 欧洲不卡视频| 久久久久久久久网站| 国产激情视频在线看| 欧美综合第一页| 国产精品.xx视频.xxtv| 成人综合色站| 西野翔中文久久精品字幕| 奇米精品在线| 国产伦精品一区二区三区视频孕妇 | 色小说视频一区| 国产高清一区二区三区视频 | 久久嫩草捆绑紧缚| 中文字幕一区在线观看| 欧美高清视频一区二区三区| 亚洲国产精品久久一线不卡| 天堂网中文字幕| 欧美人与z0zoxxxx视频| 黄色一级大片在线免费看国产| 日韩精品黄色网| 免费日本一区二区三区视频| 欧美精品久久久久a| 久久夜夜久久| 好看的日韩精品视频在线| 成人区精品一区二区婷婷| 97超碰人人爱| 三级不卡在线观看| 亚洲精品中文字幕乱码无线| 99久久精品国产网站| www.黄色com| 一区二区不卡在线视频 午夜欧美不卡在 | av黄色在线播放| 日韩欧美国产综合一区| 久久久久久久影视| 欧美超级乱淫片喷水| 在线中文字幕播放| 成人免费观看网站| 欧美三级伦理在线| 黄页网站大全在线观看| 韩国成人在线视频| 欧美狂猛xxxxx乱大交3| 亚洲不卡一区二区三区| 国产精品羞羞答答在线| 自拍视频国产精品| 92久久精品| 超碰97在线资源| 欧美a级片一区| 日本激情综合网| 国产婷婷色一区二区三区四区| 久久综合综合久久| 欧美色精品在线视频| 深夜影院在线观看| 久久91亚洲人成电影网站| 成人影院在线免费观看| 日韩精品欧美一区二区三区| 亚洲少妇一区| 99精品一区二区三区无码吞精| 最近日韩中文字幕| 国产一级做a爱免费视频| 日韩精品专区在线影院重磅| 伦理片一区二区三区| 欧美亚洲日本黄色| 成人午夜大片| 日本黄大片在线观看| 九九视频精品免费| 色综合久久久888| 国语对白在线刺激| 成人网中文字幕| 日本a级不卡| 一道本在线免费视频| 国产三级一区二区| 亚洲第一网站在线观看| 亚洲欧美日韩区| 卡通欧美亚洲| 欧美日韩高清在线一区| 亚洲一区二区三区| 成 人 黄 色 小说网站 s色| 欧美激情一二三区| 一级黄色在线观看| 中文字幕日韩欧美| 久久精品97| 日韩第一页在线观看| 黄页网站大全一区二区| 三级全黄做爰视频| 日韩精品专区在线影院重磅| 婷婷丁香在线| 国产精品一区二区三区精品| 自由日本语亚洲人高潮| 欧美xxxxx少妇| 午夜精品福利一区二区三区av | 亚洲第一二三四五区| 97在线视频免费观看完整版| 精品无码久久久久久久动漫| 三级在线观看一区二区| 色欲AV无码精品一区二区久久| 在线观看免费亚洲| 麻豆电影在线播放| 99porn视频在线| 一区二区亚洲精品| 日本少妇高潮喷水xxxxxxx| 91国偷自产一区二区使用方法| 国产三级在线看| julia一区二区中文久久94| 韩日欧美一区| 美国黄色a级片| 欧美美女网站色| 91白丝在线| 日本一区二区三区视频在线观看 | 91精品国产高清91久久久久久| 亚洲国产一区二区a毛片| 亚州av在线播放| 成人黄色av播放免费| 国内精品久久久久久久影视蜜臀 | 久久亚洲免费视频| 国产偷人爽久久久久久老妇app | 99在线观看视频| 一区二区三区福利| 自拍偷拍视频亚洲| 日韩精品中文字幕一区二区三区|