成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分布式鎖最終解決方案是RedLock嗎?為什么?

數據庫 Redis
RedLock 算法旨在解決單個 Redis 實例作為分布式鎖時可能出現的單點故障問題,通過在多個獨立運行的 Redis 實例上同時獲取鎖的方式來提高鎖服務的可用性和安全性。

RedLock 是 Redis 分布式鎖的一種實現方案,由 Redis 的作者 Salvatore Sanfilippo 提出。

RedLock 算法旨在解決單個 Redis 實例作為分布式鎖時可能出現的單點故障問題,通過在多個獨立運行的 Redis 實例上同時獲取鎖的方式來提高鎖服務的可用性和安全性。

1、實現思路

RedLock 是對集群的每個節點進行加鎖,如果大多數節點(N/2+1)加鎖成功,則才會認為加鎖成功。這樣即使集群中有某個節點掛掉了,因為大部分集群節點都加鎖成功了,所以分布式鎖還是可以繼續使用的。

2、實現代碼

在 Java 開發中,可以使用 Redisson 框架很方便的實現 RedLock,具體操作代碼如下:

import org.redisson.Redisson;
import org.redisson.api.RedisClient;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.redisson.RedissonRedLock;

public class RedLockDemo {

    public static void main(String[] args) {
        // 創建 Redisson 客戶端配置
        Config config = new Config();
        config.useClusterServers()
        .addNodeAddress("redis://127.0.0.1:6379",
                        "redis://127.0.0.1:6380",
                        "redis://127.0.0.1:6381"); // 假設有三個 Redis 節點
        // 創建 Redisson 客戶端實例
        RedissonClient redissonClient = Redisson.create(config);
        // 創建 RedLock 對象
        RedissonRedLock redLock = redissonClient.getRedLock("resource");
        try {
            // 嘗試獲取分布式鎖,最多嘗試 5 秒獲取鎖,并且鎖的有效期為 5000 毫秒
            boolean lockAcquired = redLock.tryLock(5, 5000, TimeUnit.MILLISECONDS); 
            if (lockAcquired) {
                // 加鎖成功,執行業務代碼...
            } else {
                System.out.println("Failed to acquire the lock!");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println("Interrupted while acquiring the lock");
        } finally {
            // 無論是否成功獲取到鎖,在業務邏輯結束后都要釋放鎖
            if (redLock.isLocked()) {
                redLock.unlock();
            }
            // 關閉 Redisson 客戶端連接
            redissonClient.shutdown();
        }
    }
}

3、實現原理

Redisson 中的 RedLock 是基于 RedissonMultiLock(聯鎖)實現的。

RedissonMultiLock 是 Redisson 提供的一種分布式鎖類型,它可以同時操作多個鎖,以達到對多個鎖進行統一管理的目的。聯鎖的操作是原子性的,即要么全部鎖住,要么全部解鎖。這樣可以保證多個鎖的一致性。

RedissonMultiLock 使用示例如下:

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.multi.MultiLock;

public class RedissonMultiLockDemo {

    public static void main(String[] args) throws InterruptedException {
        // 創建 Redisson 客戶端
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient redisson = Redisson.create(config);

        // 創建多個分布式鎖實例
        RLock lock1 = redisson.getLock("lock1");
        RLock lock2 = redisson.getLock("lock2");
        RLock lock3 = redisson.getLock("lock3");

        // 創建 RedissonMultiLock 對象
        MultiLock multiLock = new MultiLock(lock1, lock2, lock3);

        // 加鎖
        multiLock.lock();
        try {
            // 執行任務
            System.out.println("Lock acquired. Task started.");
            Thread.sleep(3000);
            System.out.println("Task finished. Releasing the lock.");
        } finally {
            // 釋放鎖
            multiLock.unlock();
        }
        // 關閉客戶端連接
        redisson.shutdown();
    }
}

在示例中,我們首先創建了一個 Redisson 客戶端并連接到 Redis 服務器。然后,我們使用 redisson.getLock 方法創建了多個分布式鎖實例。接下來,我們通過傳入這些鎖實例來創建了 RedissonMultiLock 對象。

說回正題,RedissonRedLock 是基于 RedissonMultiLock 實現的這點,可以從繼承關系看出。

RedissonRedLock 繼承自 RedissonMultiLock,核心實現源碼如下:

public class RedissonRedLock extends RedissonMultiLock {
    public RedissonRedLock(RLock... locks) {
        super(locks);
    }

    /**
     * 鎖可以失敗的次數,鎖的數量-鎖成功客戶端最小的數量
     */
    @Override
    protected int failedLocksLimit() {
        return locks.size() - minLocksAmount(locks);
    }

    /**
     * 鎖的數量 / 2 + 1,例如有3個客戶端加鎖,那么最少需要2個客戶端加鎖成功
     */
    protected int minLocksAmount(final List<RLock> locks) {
        return locks.size()/2 + 1;
    }

    /** 
     * 計算多個客戶端一起加鎖的超時時間,每個客戶端的等待時間
     */
    @Override
    protected long calcLockWaitTime(long remainTime) {
        return Math.max(remainTime / locks.size(), 1);
    }

    @Override
    public void unlock() {
        unlockInner(locks);
    }
}

從上述源碼可以看出,Redisson 中的 RedLock 是基于 RedissonMultiLock(聯鎖)實現的,當 RedLock 是對集群的每個節點進行加鎖,如果大多數節點,也就是 N/2+1 個節點加鎖成功,則認為 RedLock 加鎖成功。

4、存在問題

RedLock 主要存在以下兩個問題:

  • 性能問題:RedLock 要等待大多數節點返回之后,才能加鎖成功,而這個過程中可能會因為網絡問題,或節點超時的問題,影響加鎖的性能。
  • 并發安全性問題:當客戶端加鎖時,如果遇到 GC 可能會導致加鎖失效,但 GC 后誤認為加鎖成功的安全事故,例如以下流程:
  1. 客戶端 A 請求 3 個節點進行加鎖。
  2. 在節點回復處理之前,客戶端 A 進入 GC 階段(存在 STW,全局停頓)。
  3. 之后因為加鎖時間的原因,鎖已經失效了。
  4. 客戶端 B 請求加鎖(和客戶端 A 是同一把鎖),加鎖成功。
  5. 客戶端 A GC 完成,繼續處理前面節點的消息,誤以為加鎖成功。
  6. 此時客戶端 B 和客戶端 A 同時加鎖成功,出現并發安全性問題。

5、已廢棄 RedLock

因為 RedLock 存在的問題爭議較大,且沒有完美的解決方案,所以 Redisson 中已經廢棄了 RedLock,這一點在 Redisson 官方文檔中能找到,如下圖所示:

6、廢棄 RedLock 后的解決方案

雖然 Redisson 中已經廢棄了 RedLock,但是你可以直接使用 Redisson 中的普通的加鎖即可,因為它的普通鎖會基于 wait 機制,等待鎖將信息同步到從節點,從而保證數據一致性的,雖然不能完全避免數據一致性問題,但也能最大限度的保證數據的一致性。

課后思考

既然普通的分布式鎖存在單點問題?而 RedLock 又不是最完美的解決方案,那么在分布式鎖領域,誰才是最終的解決方案呢?請在評論區留下您的解決方案,以及對應的原因?

責任編輯:姜華 來源: Java中文社群
相關推薦

2019-06-19 15:40:06

分布式鎖RedisJava

2019-09-09 10:09:51

分布式事務 數據庫

2023-09-28 08:39:23

分布式鎖Redis

2023-03-05 18:23:38

分布式ID節點

2022-02-10 08:57:45

分布式線程鎖

2021-06-03 00:02:43

RedisRedlock算法

2021-07-30 00:09:21

Redlock算法Redis

2023-09-14 15:44:46

分布式事務數據存儲

2020-05-28 09:35:05

分布式事務方案

2025-04-29 04:00:00

分布式事務事務消息

2025-04-28 00:44:04

2020-09-23 09:52:01

分布式WebSocketMQ

2024-03-26 12:08:53

分布式事務存儲

2019-01-11 18:22:07

阿里巴巴技術開源

2010-07-21 13:53:41

SQL Server分

2025-05-07 00:10:00

分布式事務TCC模式

2020-04-26 09:48:55

Redis面試

2010-06-30 17:27:32

SQL Server數

2021-09-28 09:43:11

微服務架構技術

2021-05-08 08:01:05

Session登錄瀏覽器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级毛片视频 | 人妖无码 | 亚洲精品一区二区三区中文字幕 | 欧美一级视频在线观看 | 国产美女精品视频 | 欧美色性| 97偷拍视频 | 国产一区二区在线播放 | 日韩欧美在线播放 | 国产福利资源在线 | 国产一区免费 | 在线观看成年人视频 | 四虎成人在线播放 | 国产xxx在线观看 | 日韩 国产 在线 | 亚洲综合日韩精品欧美综合区 | 欧美女优在线观看 | 高清国产一区二区 | 日韩小视频在线 | 亚洲视频一区在线观看 | 国产ts人妖系列高潮 | 国产一级一片免费播放 | 欧美日韩中文在线观看 | 精品在线一区二区三区 | 欧美成人一区二区 | 久久精品16 | 国产美女自拍视频 | 国产激情在线看 | 老牛影视av一区二区在线观看 | 美女网站视频免费黄 | 日日摸夜夜添夜夜添特色大片 | 亚洲乱码国产乱码精品精98午夜 | 日本黄色的视频 | 日本成人综合 | 国产亚洲精品久久久优势 | 91精品国产乱码久久蜜臀 | 黑人巨大精品欧美黑白配亚洲 | 久久精品视频一区二区三区 | 免费 视频 1级 | 国产精品免费一区二区三区四区 | 久草在线中文888 |