亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redisson主從一致性問題怎么解決

發布時間:2022-08-26 14:02:52 來源:億速云 閱讀:192 作者:iii 欄目:開發技術

這篇文章主要介紹了Redisson主從一致性問題怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Redisson主從一致性問題怎么解決文章都會有所收獲,下面我們一起來看看吧。

Redisson 主從一致性

  • 我們先來說一下 Redis 的主從模式,Redis Master(主節點)中處理所有發向 Redis 的寫操作(增刪改),Redis Slave (從節點)只負責處理讀操作,主節點會不斷將自己的數據同步給從節點,確保主從之間的數據一致性,但是數據同步會存在一定的延時,主從一致性問題就是因為延時而導致的

  • 比如我們通過 set lock thread1 nx ex 10 來獲取鎖,主節點就會保存這個鎖的標識 thread1,然后主節點會向從節點進行同步,但在同步尚未完成時時主節點發生故障,Redis 哨兵發現主節點宕機后,客戶端連接會斷開,然后從從節點中選出一個作為新的主節點,但是由于之前主從同步未完成,即 thread1 這個鎖已經丟失,所以此時 Java 應用再來訪問新的主節點時就會發現鎖失效了,此時其他線程來獲取鎖時也能獲取成功,這時就可能出現并發安全問題,以上就是主從一致性導致的鎖失效問題

  • 那么 Redisson 是如何解決上述問題的呢?既然導致主從一致性問題發生的主要原因是主從同步延時問題,Redisson 干脆直接舍棄了主從節點,所有 Redis 節點都是獨立的節點,相互之間無任何關系,都可以做讀寫操作。此時,我們想獲取鎖就必須依次向多個 Redis 都去獲取鎖(之前直接向 Master 節點獲取就可以),多個 Redis 節點都保存鎖的標識,才算獲取成功

  • 這樣一來,由于所有節點都是獨立的,所以避免了主從一致性問題;又由于所有的節點都保存了鎖標識,即使由一個節點宕機,其他的節點也保存有鎖的標識,保證了高可用,并且可用性會隨著節點的增多而增高

  • 此外,我們還以為給這些獨立的節點再加上從節點 Slave,即使一個獨立節點宕機了導致其對應的從節點變成新的主節點,且節點上鎖標識丟失了也沒有關系,因為我們只有在每一個節點都拿到鎖才算成功, 盡管可以在這個空虛的節點上獲取到鎖,但在其他節點上是獲取不到的,最終仍然是失敗,因此只要有任意一個節點存貨,其他線程就不可能拿到鎖,就不會出現鎖失效問題。這樣,既保留了主從同步機制,又確保了 Redis 集群的高可用特性,同時還避免了主從一致所引發的鎖失效問題,這個方案就叫做 mutilLock

Java 實現 mutilLock

RedissonConfig.java

package com.hmdp.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissonConfig {
    @Bean
    public RedissonClient redissonClient() {
        // 配置
        Config config = new Config();
        // 地址 & 密碼
        config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
        // 創建 RedissonClient 對象
        return Redisson.create(config);
    }
    @Bean
    public RedissonClient redissonClient2() {
        // 配置
        Config config = new Config();
        // 地址 & 密碼
        config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
        // 創建 RedissonClient 對象
        return Redisson.create(config);
    }
    @Bean
    public RedissonClient redissonClient3() {
        // 配置
        Config config = new Config();
        // 地址 & 密碼
        config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
        // 創建 RedissonClient 對象
        return Redisson.create(config);
    }
}

TestRedisson.java

package com.hmdp;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
@Slf4j
@SpringBootTest
public class TestRedisson {
    @Resource
    private RedissonClient redissonClient;
    @Resource
    private RedissonClient redissonClient2;
    @Resource
    private RedissonClient redissonClient3;
    private RLock lock;
    @BeforeEach
    void setUp() {
        RLock lock1 = redissonClient.getLock("order");
        RLock lock2 = redissonClient2.getLock("order");
        RLock lock3 = redissonClient3.getLock("order");
        // 創建連鎖 multiLock
        lock = redissonClient.getMultiLock(lock1, lock2, lock3);
    }
    @Test
    void method1() throws InterruptedException {
        // 嘗試獲取鎖
        boolean isLock = lock.tryLock(1L, TimeUnit.SECONDS);
        if (!isLock) {
            log.error("獲取鎖失敗 .... 1");
            return;
        }
        try {
            log.info("獲取鎖成功 .... 1");
            method2();
            log.info("開始執行業務 .... 1");
        } finally {
            log.warn("準備釋放鎖 .... 1");
            lock.unlock();
        }
    }
    void method2() {
        // 嘗試獲取鎖
        boolean isLock = lock.tryLock();
        if (!isLock) {
            log.error("獲取鎖失敗 .... 2");
            return;
        }
        try {
            log.info("獲取鎖成功 .... 2");
            log.info("開始執行業務 .... 2");
        } finally {
            log.warn("準備釋放鎖 .... 2");
            lock.unlock();
        }
    }
}

跟蹤源碼,我們發現只有所有的鎖都獲取成功了才會返回 true

關于“Redisson主從一致性問題怎么解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Redisson主從一致性問題怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

老河口市| 屏边| 宜昌市| 贵州省| 略阳县| 酒泉市| 东兴市| 鄂托克旗| 霍城县| 遂昌县| 松潘县| 河间市| 江孜县| 长岭县| 文水县| 乌拉特中旗| 阿勒泰市| 调兵山市| 正安县| 珠海市| 北海市| 沂水县| 桐柏县| 和龙市| 天峻县| 武定县| 许昌县| 定襄县| 易门县| 冷水江市| 新建县| 富裕县| 昭通市| 芜湖县| 安宁市| 南靖县| 军事| 龙川县| 平阳县| 桂林市| 綦江县|