欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redisson 主從一致性問題詳解

 更新時間:2022年08月26日 11:34:36   作者:ruochen  
這篇文章主要為大家介紹了Redisson 主從一致性問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Redisson 主從一致性

  • 我們先來說一下 Redis 的主從模式,Redis Master(主節(jié)點(diǎn))中處理所有發(fā)向 Redis 的寫操作(增刪改),Redis Slave (從節(jié)點(diǎn))只負(fù)責(zé)處理讀操作,主節(jié)點(diǎn)會不斷將自己的數(shù)據(jù)同步給從節(jié)點(diǎn),確保主從之間的數(shù)據(jù)一致性,但是數(shù)據(jù)同步會存在一定的延時,主從一致性問題就是因?yàn)檠訒r而導(dǎo)致的
  • 比如我們通過 set lock thread1 nx ex 10 來獲取鎖,主節(jié)點(diǎn)就會保存這個鎖的標(biāo)識 thread1,然后主節(jié)點(diǎn)會向從節(jié)點(diǎn)進(jìn)行同步,但在同步尚未完成時時主節(jié)點(diǎn)發(fā)生故障,Redis 哨兵發(fā)現(xiàn)主節(jié)點(diǎn)宕機(jī)后,客戶端連接會斷開,然后從從節(jié)點(diǎn)中選出一個作為新的主節(jié)點(diǎn),但是由于之前主從同步未完成,即 thread1 這個鎖已經(jīng)丟失,所以此時 Java 應(yīng)用再來訪問新的主節(jié)點(diǎn)時就會發(fā)現(xiàn)鎖失效了,此時其他線程來獲取鎖時也能獲取成功,這時就可能出現(xiàn)并發(fā)安全問題,以上就是主從一致性導(dǎo)致的鎖失效問題
  • 那么 Redisson 是如何解決上述問題的呢?既然導(dǎo)致主從一致性問題發(fā)生的主要原因是主從同步延時問題,Redisson 干脆直接舍棄了主從節(jié)點(diǎn),所有 Redis 節(jié)點(diǎn)都是獨(dú)立的節(jié)點(diǎn),相互之間無任何關(guān)系,都可以做讀寫操作。此時,我們想獲取鎖就必須依次向多個 Redis 都去獲取鎖(之前直接向 Master 節(jié)點(diǎn)獲取就可以),多個 Redis 節(jié)點(diǎn)都保存鎖的標(biāo)識,才算獲取成功
  • 這樣一來,由于所有節(jié)點(diǎn)都是獨(dú)立的,所以避免了主從一致性問題;又由于所有的節(jié)點(diǎn)都保存了鎖標(biāo)識,即使由一個節(jié)點(diǎn)宕機(jī),其他的節(jié)點(diǎn)也保存有鎖的標(biāo)識,保證了高可用,并且可用性會隨著節(jié)點(diǎn)的增多而增高
  • 此外,我們還以為給這些獨(dú)立的節(jié)點(diǎn)再加上從節(jié)點(diǎn) Slave,即使一個獨(dú)立節(jié)點(diǎn)宕機(jī)了導(dǎo)致其對應(yīng)的從節(jié)點(diǎn)變成新的主節(jié)點(diǎn),且節(jié)點(diǎn)上鎖標(biāo)識丟失了也沒有關(guān)系,因?yàn)槲覀冎挥性诿恳粋€節(jié)點(diǎn)都拿到鎖才算成功, 盡管可以在這個空虛的節(jié)點(diǎn)上獲取到鎖,但在其他節(jié)點(diǎn)上是獲取不到的,最終仍然是失敗,因此只要有任意一個節(jié)點(diǎn)存貨,其他線程就不可能拿到鎖,就不會出現(xiàn)鎖失效問題。這樣,既保留了主從同步機(jī)制,又確保了 Redis 集群的高可用特性,同時還避免了主從一致所引發(fā)的鎖失效問題,這個方案就叫做 mutilLock

Java 實(shí)現(xiàn) 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");
        // 創(chuàng)建 RedissonClient 對象
        return Redisson.create(config);
    }
    @Bean
    public RedissonClient redissonClient2() {
        // 配置
        Config config = new Config();
        // 地址 & 密碼
        config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
        // 創(chuàng)建 RedissonClient 對象
        return Redisson.create(config);
    }
    @Bean
    public RedissonClient redissonClient3() {
        // 配置
        Config config = new Config();
        // 地址 & 密碼
        config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
        // 創(chuàng)建 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");
        // 創(chuàng)建連鎖 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("開始執(zhí)行業(yè)務(wù) .... 1");
        } finally {
            log.warn("準(zhǔn)備釋放鎖 .... 1");
            lock.unlock();
        }
    }
    void method2() {
        // 嘗試獲取鎖
        boolean isLock = lock.tryLock();
        if (!isLock) {
            log.error("獲取鎖失敗 .... 2");
            return;
        }
        try {
            log.info("獲取鎖成功 .... 2");
            log.info("開始執(zhí)行業(yè)務(wù) .... 2");
        } finally {
            log.warn("準(zhǔn)備釋放鎖 .... 2");
            lock.unlock();
        }
    }
}

跟蹤源碼,我們發(fā)現(xiàn)只有所有的鎖都獲取成功了才會返回 true

以上就是Redisson 主從一致性問題詳解的詳細(xì)內(nèi)容,更多關(guān)于Redisson 主從一致的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis3.2.6配置文件詳細(xì)中文說明

    Redis3.2.6配置文件詳細(xì)中文說明

    本文為大家分享了Redis3.2.6配置文件詳細(xì)中文說明,非常詳細(xì)收藏起來以后工作有用
    2018-10-10
  • redis實(shí)現(xiàn)的四種常見限流策略

    redis實(shí)現(xiàn)的四種常見限流策略

    因?yàn)樵诰W(wǎng)站運(yùn)行期間可能會因?yàn)橥蝗坏脑L問量導(dǎo)致業(yè)務(wù)異常、也有可能遭受別人惡意攻,所以我們對網(wǎng)站要進(jìn)行限流,本文主要介紹了redis四種常見限流策略,感興趣的可以了解一下
    2021-06-06
  • 緩存替換策略及應(yīng)用(以Redis、InnoDB為例)

    緩存替換策略及應(yīng)用(以Redis、InnoDB為例)

    本文以Redis、InnoDB為例給大家講解緩存替換策略及應(yīng)用,本文給大家提到五種置換策略,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • Redis性能監(jiān)控的實(shí)現(xiàn)

    Redis性能監(jiān)控的實(shí)現(xiàn)

    本文使用 redis_exporter + prometheus +grafana 實(shí)現(xiàn)對Redis服務(wù)進(jìn)行監(jiān)控,原因:成本低,人工干預(yù)少,感興趣的可以了解一下
    2021-07-07
  • Redis做數(shù)據(jù)持久化的解決方案及底層原理

    Redis做數(shù)據(jù)持久化的解決方案及底層原理

    Redis有兩種方式來實(shí)現(xiàn)數(shù)據(jù)的持久化,分別是RDB(Redis Database)和AOF(Append Only File),今天通過本文給大家聊一聊Redis做數(shù)據(jù)持久化的解決方案及底層原理,感興趣的朋友一起看看吧
    2021-07-07
  • Springboot/Springcloud項(xiàng)目集成redis進(jìn)行存取的過程解析

    Springboot/Springcloud項(xiàng)目集成redis進(jìn)行存取的過程解析

    大家都知道Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合),本文重點(diǎn)給大家介紹Springboot/Springcloud項(xiàng)目集成redis進(jìn)行存取的過程,需要的朋友參考下吧
    2021-12-12
  • 淺談Redis處理接口冪等性的兩種方案

    淺談Redis處理接口冪等性的兩種方案

    本文主要介紹了淺談Redis處理接口冪等性的兩種方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 通過實(shí)例解析布隆過濾器工作原理及實(shí)例

    通過實(shí)例解析布隆過濾器工作原理及實(shí)例

    這篇文章主要介紹了通過實(shí)例解析布隆過濾器工作原理及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Redis如何實(shí)現(xiàn)分布式鎖

    Redis如何實(shí)現(xiàn)分布式鎖

    相信大家對鎖已經(jīng)不陌生了,本文主要介紹了Redis如何實(shí)現(xiàn)分布式鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 如何使用gradle將java項(xiàng)目推送至maven中央倉庫

    如何使用gradle將java項(xiàng)目推送至maven中央倉庫

    本文主要介紹了使用gradle將java項(xiàng)目推送至maven中央倉庫,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論