广告
返回顶部
首页 > 资讯 > 数据库 >Redisson 主从一致性问题详解
  • 699
分享到

Redisson 主从一致性问题详解

2024-04-02 19:04:59 699人浏览 泡泡鱼
摘要

目录Redisson 主从一致性Java 实现 mutilLockRedissonConfig.javaTestRedisson.javaRedisson 主从一致性 我们先来说一下 Redis 的主从模式,Redis

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 主从一致性问题详解的详细内容,更多关于Redisson 主从一致的资料请关注我们其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Redisson 主从一致性问题详解

本文链接: https://www.lsjlt.com/news/33877.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redisson 主从一致性问题详解
    目录Redisson 主从一致性Java 实现 mutilLockRedissonConfig.javaTestRedisson.javaRedisson 主从一致性 我们先来说一下 Redis 的主从模式,Redis ...
    99+
    2022-08-26
  • Redisson主从一致性问题详解
    目录Redisson 主从一致性Java 实现 mutilLockRedissonConfig.javaTestRedisson.javaRedisson 主从一致性 我们先来说一下...
    99+
    2022-11-13
  • MySQL主从不一致的问题分析
    这篇文章主要讲解了“MySQL主从不一致的问题分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL主从不一致的问题分析”吧!  &nbs...
    99+
    2022-10-18
  • redis 数据库主从不一致问题解决方案
     在聊数据库与缓存一致性问题之前,先聊聊数据库主库与从库的一致性问题。   问:常见的数据库集群架构如何? 答:一主多从,主从同步,读写分离。 如上图: (1)一个主库提供写服务 (2)多个从库提供读服务,可以增加从库提升读性能 (3)主...
    99+
    2020-05-07
    redis 数据库主从不一致问题解决方案
  • 解决MySQL主从复制不一致问题的主要几个方法
    下面讲讲关于解决MySQL主从复制不一致问题的主要几个方法,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完解决MySQL主从复制不一致问题的主要几个方法这篇文章你一定会有所受益。...
    99+
    2022-10-18
  • 详解redis缓存与数据库一致性问题解决
    数据库与缓存读写模式策略 写完数据库后是否需要马上更新缓存还是直接删除缓存? (1)、如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马上更新缓存,但是如果对于那...
    99+
    2022-11-11
  • mysql5.6搭建主从过程中遇到主从server_uuid一致无法同步的问题怎么解决
    本篇内容介绍了“mysql5.6搭建主从过程中遇到主从server_uuid一致无法同步的问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
    99+
    2022-10-18
  • redis一致性问题如何解决
    Redis是一个内存数据库,是单进程单线程的,所以它没有复制和分布式的特性。因此,Redis本身并没有提供一致性的解决方案。然而,可...
    99+
    2023-08-20
    redis
  • 详解Java分布式系统中session一致性问题
    业务场景 在单机系统中,用户登陆之后,服务端会保存用户的会话信息,只要用户不退出重新登陆,在一段时间内用户可以一直访问该网站,无需重复登陆。用户的信息存在服务端的 session 中...
    99+
    2022-11-12
  • redis缓存一致性问题怎么解决
    在使用 Redis 缓存时,可能会遇到缓存一致性问题,即缓存中的数据与数据库中的数据不一致。以下是一些常见的解决方法: 缓存更新...
    99+
    2023-10-26
    redis
  • Redis与MySQL数据一致性问题解析
    引言 在现代的应用程序开发中,数据一致性是一个非常重要的问题。对于使用MySQL作为主要数据库的应用程序而言,保持与Redis缓存之间的数据一致性尤为关键。Redis作为一种高性能的内存数据库,常用于缓存和提高应用程序的读取性能。然而,由于...
    99+
    2023-09-01
    redis mysql 数据库
  • mysql5.6主从搭建以及不同步问题详解
    目录一、mysql主从复制原理二、mysql编译安装三、主从配置四、主从不同步系统:centos6.6 主:192.168.142.129 ...
    99+
    2022-11-12
  • redis宕机后数据一致性问题怎么解决
    当Redis宕机后导致数据不一致的问题,可以通过以下几种方式解决:1. 持久化机制:Redis提供了RDB和AOF两种持久化机制。R...
    99+
    2023-09-05
    redis
  • MySQL和Redis的数据一致性问题怎么解决
    本篇内容主要讲解“MySQL和Redis的数据一致性问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL和Redis的数据一致性问题怎么解决”吧!前言:在数据读多写少的情况下作为...
    99+
    2023-06-29
  • Redis与MySQL的双写一致性问题怎么解决
    本篇内容介绍了“Redis与MySQL的双写一致性问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis与MySQL双写一致性...
    99+
    2023-07-05
  • redis缓存和数据库一致性问题如何解决
    在使用Redis缓存时,常常会遇到与数据库一致性的问题。当数据发生变更时,需要保证Redis缓存与数据库的数据保持一致。以下是几种常...
    99+
    2023-08-24
    redis
  • 一文教你迅速解决分布式事务XA一致性问题
    近日,腾讯云发布了分布式数据库解决方案(DCDB),其最明显的特性之一就是提供了高于开源分布式事务XA的性能。大型业务系统有着用户多、并发高的特点,在这方面,集中式数据库(单机数据库)的性能很难支持,因此主流的互联网公司往往采用分布式(架构...
    99+
    2023-06-04
  • Java分布式系统中session一致性问题怎么解决
    小编给大家分享一下Java分布式系统中session一致性问题怎么解决,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java可以用来干什么Java主要应用于:1....
    99+
    2023-06-14
  • 如何解决PHP开发中的存储和缓存一致性问题
    在PHP开发中,存储和缓存是常见的数据处理方式。然而,存储和缓存的不一致性可能会导致错误的数据结果,从而影响系统的可靠性和性能。为了解决这个问题,我们可以采取一些措施来确保存储和缓存的一致性。一、使用事务处理事务是一组操作的集合,可以被看作...
    99+
    2023-10-21
    PHP开发 缓存一致性 存储问题
  • 解决Mybatis plus实体类属性与表字段不一致的问题
    下面看下Mybatis plus实体类属性与表字段不一致的问题,内容如下所示: 主要注释到实体类上的注解: @TableName(value = …)当数据库名与实体类...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作