最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redisson 主從一致性問(wèn)題詳解

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

Redisson 主從一致性

  • 我們先來(lái)說(shuō)一下 Redis 的主從模式,Redis Master(主節(jié)點(diǎn))中處理所有發(fā)向 Redis 的寫(xiě)操作(增刪改),Redis Slave (從節(jié)點(diǎn))只負(fù)責(zé)處理讀操作,主節(jié)點(diǎn)會(huì)不斷將自己的數(shù)據(jù)同步給從節(jié)點(diǎn),確保主從之間的數(shù)據(jù)一致性,但是數(shù)據(jù)同步會(huì)存在一定的延時(shí),主從一致性問(wèn)題就是因?yàn)檠訒r(shí)而導(dǎo)致的
  • 比如我們通過(guò) set lock thread1 nx ex 10 來(lái)獲取鎖,主節(jié)點(diǎn)就會(huì)保存這個(gè)鎖的標(biāo)識(shí) thread1,然后主節(jié)點(diǎn)會(huì)向從節(jié)點(diǎn)進(jìn)行同步,但在同步尚未完成時(shí)時(shí)主節(jié)點(diǎn)發(fā)生故障,Redis 哨兵發(fā)現(xiàn)主節(jié)點(diǎn)宕機(jī)后,客戶端連接會(huì)斷開(kāi),然后從從節(jié)點(diǎn)中選出一個(gè)作為新的主節(jié)點(diǎn),但是由于之前主從同步未完成,即 thread1 這個(gè)鎖已經(jīng)丟失,所以此時(shí) Java 應(yīng)用再來(lái)訪問(wèn)新的主節(jié)點(diǎn)時(shí)就會(huì)發(fā)現(xiàn)鎖失效了,此時(shí)其他線程來(lái)獲取鎖時(shí)也能獲取成功,這時(shí)就可能出現(xiàn)并發(fā)安全問(wèn)題,以上就是主從一致性導(dǎo)致的鎖失效問(wèn)題
  • 那么 Redisson 是如何解決上述問(wèn)題的呢?既然導(dǎo)致主從一致性問(wèn)題發(fā)生的主要原因是主從同步延時(shí)問(wèn)題,Redisson 干脆直接舍棄了主從節(jié)點(diǎn),所有 Redis 節(jié)點(diǎn)都是獨(dú)立的節(jié)點(diǎn),相互之間無(wú)任何關(guān)系,都可以做讀寫(xiě)操作。此時(shí),我們想獲取鎖就必須依次向多個(gè) Redis 都去獲取鎖(之前直接向 Master 節(jié)點(diǎn)獲取就可以),多個(gè) Redis 節(jié)點(diǎn)都保存鎖的標(biāo)識(shí),才算獲取成功
  • 這樣一來(lái),由于所有節(jié)點(diǎn)都是獨(dú)立的,所以避免了主從一致性問(wèn)題;又由于所有的節(jié)點(diǎn)都保存了鎖標(biāo)識(shí),即使由一個(gè)節(jié)點(diǎn)宕機(jī),其他的節(jié)點(diǎn)也保存有鎖的標(biāo)識(shí),保證了高可用,并且可用性會(huì)隨著節(jié)點(diǎn)的增多而增高
  • 此外,我們還以為給這些獨(dú)立的節(jié)點(diǎn)再加上從節(jié)點(diǎn) Slave,即使一個(gè)獨(dú)立節(jié)點(diǎn)宕機(jī)了導(dǎo)致其對(duì)應(yīng)的從節(jié)點(diǎn)變成新的主節(jié)點(diǎn),且節(jié)點(diǎn)上鎖標(biāo)識(shí)丟失了也沒(méi)有關(guān)系,因?yàn)槲覀冎挥性诿恳粋€(gè)節(jié)點(diǎn)都拿到鎖才算成功, 盡管可以在這個(gè)空虛的節(jié)點(diǎn)上獲取到鎖,但在其他節(jié)點(diǎn)上是獲取不到的,最終仍然是失敗,因此只要有任意一個(gè)節(jié)點(diǎn)存貨,其他線程就不可能拿到鎖,就不會(huì)出現(xiàn)鎖失效問(wèn)題。這樣,既保留了主從同步機(jī)制,又確保了 Redis 集群的高可用特性,同時(shí)還避免了主從一致所引發(fā)的鎖失效問(wèn)題,這個(gè)方案就叫做 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 對(duì)象
        return Redisson.create(config);
    }
    @Bean
    public RedissonClient redissonClient2() {
        // 配置
        Config config = new Config();
        // 地址 & 密碼
        config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
        // 創(chuàng)建 RedissonClient 對(duì)象
        return Redisson.create(config);
    }
    @Bean
    public RedissonClient redissonClient3() {
        // 配置
        Config config = new Config();
        // 地址 & 密碼
        config.useSingleServer().setAddress("redis://ip:端口").setPassword("pwd");
        // 創(chuàng)建 RedissonClient 對(duì)象
        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("開(kāi)始執(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("開(kāi)始執(zhí)行業(yè)務(wù) .... 2");
        } finally {
            log.warn("準(zhǔn)備釋放鎖 .... 2");
            lock.unlock();
        }
    }
}

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

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

相關(guān)文章

  • 利用Supervisor管理Redis進(jìn)程的方法教程

    利用Supervisor管理Redis進(jìn)程的方法教程

    Supervisor 是可以在類 UNIX 系統(tǒng)中進(jìn)行管理和監(jiān)控各種進(jìn)程的小型系統(tǒng)。它自帶了客戶端和服務(wù)端工具,下面這篇文章主要給大家介紹了關(guān)于利用Supervisor管理Redis進(jìn)程的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • Redis鏈表底層實(shí)現(xiàn)及生產(chǎn)實(shí)戰(zhàn)

    Redis鏈表底層實(shí)現(xiàn)及生產(chǎn)實(shí)戰(zhàn)

    Redis 的 List 是一個(gè)雙向鏈表,鏈表中的每個(gè)節(jié)點(diǎn)都包含了一個(gè)字符串。是redis中最常用的數(shù)據(jù)結(jié)構(gòu)之一,本文主要介紹了Redis鏈表底層實(shí)現(xiàn)及生產(chǎn)實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • RabbitMQ+redis+Redisson分布式鎖+seata實(shí)現(xiàn)訂單服務(wù)的流程分析

    RabbitMQ+redis+Redisson分布式鎖+seata實(shí)現(xiàn)訂單服務(wù)的流程分析

    訂單服務(wù)涉及許多方面,分布式事務(wù),分布式鎖,例如訂單超時(shí)未支付要取消訂單,訂單如何防止重復(fù)提交,如何防止超賣(mài)、這里都會(huì)使用到,這篇文章主要介紹了RabbitMQ+redis+Redisson分布式鎖+seata實(shí)現(xiàn)訂單服務(wù)的流程分析,需要的朋友可以參考下
    2024-07-07
  • redis中redisson實(shí)現(xiàn)鎖自動(dòng)延時(shí)

    redis中redisson實(shí)現(xiàn)鎖自動(dòng)延時(shí)

    redisson作為分布式鎖能夠解決分布式的加鎖解鎖問(wèn)題,還能夠?qū)崿F(xiàn)鎖的設(shè)置存活時(shí)間以及自動(dòng)續(xù)期,本文主要介紹了redis中redisson實(shí)現(xiàn)鎖自動(dòng)延時(shí),感興趣的可以了解一下
    2024-02-02
  • 淺談為什么單線程的redis那么快

    淺談為什么單線程的redis那么快

    本文主要介紹了為什么單線程的redis那么快,主要介紹了幾點(diǎn)原因,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Redis之常用數(shù)據(jù)結(jié)構(gòu)哈希表

    Redis之常用數(shù)據(jù)結(jié)構(gòu)哈希表

    這篇文章主要介紹了Redis常用的數(shù)據(jù)結(jié)構(gòu)哈希表,哈希表是一種保存鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),具有一定的參考價(jià)值,需要的朋友可以參考閱讀
    2023-04-04
  • Redis分布式鎖的幾種實(shí)現(xiàn)方法

    Redis分布式鎖的幾種實(shí)現(xiàn)方法

    本文主要介紹了Redis分布式鎖的幾種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Redis批量刪除Key的三種方式小結(jié)

    Redis批量刪除Key的三種方式小結(jié)

    本文主要介紹了Redis批量刪除Key的三種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Windows下Redis安裝配置教程

    Windows下Redis安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Windows下Redis安裝配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • redis實(shí)現(xiàn)共同好友的思路詳解

    redis實(shí)現(xiàn)共同好友的思路詳解

    微信朋友圈大家都玩過(guò)吧,那么朋友圈的點(diǎn)贊、評(píng)論只能看到自己好友的信息是怎么操作的呢?下面通過(guò)本文給大家分享下此功能的實(shí)現(xiàn)流程,對(duì)redis實(shí)現(xiàn)共同好友的方法感興趣的朋友一起看看吧
    2021-05-05

最新評(píng)論

奎屯市| 衡阳县| 平乡县| 安康市| 三穗县| 内乡县| 宜城市| 古田县| 青岛市| 扶余县| 皋兰县| 晴隆县| 盘山县| 明星| 新巴尔虎左旗| 卢龙县| 瓮安县| 昆山市| 和田县| 武陟县| 沙雅县| 福鼎市| 聂荣县| 南汇区| 泸水县| 遵化市| 武宁县| 壶关县| 故城县| 宁陕县| 和顺县| 舒城县| 安岳县| 仲巴县| 定州市| 海宁市| 鄂温| 宁波市| 西畴县| 平定县| 大石桥市|