【Redis】Redisson 分布式锁主从一致性问题

news2024/11/16 9:39:40

一、主从一致性问题的产生

Redis 主从集群使用如下:

  • 在主节点进行数据的写操作;
  • 在节点进行数据的读操作;
  • 主节点向从节点同步数据。

在这里插入图片描述

主从一致性问题:

当主节点还没来得及将锁信息同步到从节点时,此时主节点宕机了。然后,从节点被设为主节点,这个从节点中无锁信息,因此产生了锁失效问题。

在这里插入图片描述

二、multiLock 方案解决

Redisson 提供了 multiLock 方案解决主从一致性问题,其思路如下:

设置多个并列的 Rediss 节点,对锁信息,将其写入每个 Redis 节点中。

  • 获取锁时,向多个 Redis 节点中获取锁,只有每个节点都获取锁成功,才算获取锁成功。实现了,只要有一个节点存活,其他线程就不能获取锁,锁不会失效。

  • 当其中有节点宕机时,其他节点仍然含有锁信息,其他节点仍然有效
    在这里插入图片描述

  • multiLock 思路也可搭建主从同步集群,实现了灵活性和高可用性
    在这里插入图片描述

三、multiLock 的使用

  1. 配置 Redis 客户端,搭建三个 Redis 节点 (出于简单,未设置主从)
@Configuration
public class RedisConfig {
    @Bean
    public RedissonClient redissonClient(){
        // 配置类
        Config config = new Config();
        // 设置 redis 地址
        config.useSingleServer().setAddress("redis://192.168.244.130:6379");
        // 返回
        return Redisson.create(config);
    }

    @Bean
    public RedissonClient redissonClient2(){
        // 配置类
        Config config = new Config();
        // 设置 redis 地址
        config.useSingleServer().setAddress("redis://192.168.244.131:6379");
        // 返回
        return Redisson.create(config);
    }

    @Bean
    public RedissonClient redissonClient3(){
        // 配置类
        Config config = new Config();
        // 设置 redis 地址
        config.useSingleServer().setAddress("redis://192.168.244.132:6379");
        // 返回
        return Redisson.create(config);
    }
}
  1. 使用 SpringBoot 提供的测试类进行测试
@Slf4j
@SpringBootTest
class HmDianPingApplicationTests {

	// 注入三个 Client
    @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");
        // 创建连锁 —— 用 redissonClient2、redissonClient3 也行
        lock = redissonClient.getMultiLock(lock1, lock2, lock3);
    }

	// 测试连锁 
    @Test
    public void HmDianPingApplicationTests() throws InterruptedException {
        boolean isLock = lock.tryLock(1L, TimeUnit.SECONDS);
        if(!isLock){
            System.out.println("获取锁失败");
        } else{
            System.out.println("获取锁成功");
            lock.unlock();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【产品分析】高德手机地图产品:未来搜索将从地图开始

未来的搜索从地图开始。今后的所有商务活动都将通过地图展开,使之成为兵家必争之地。要将移动流量变现为真金白银,地图将发挥至关重要的作用。 目前整个中国电子地图市场目前处于应用成熟期。在多年的快速发展和数次大型收购后,各互联网巨头已…

[附源码]计算机毕业设计家庭教育appSpringboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

腾讯在线文档根据单选的内容修改背景颜色

目录 [介绍] [条件格式] [添加条件格式] [选择单元格范围] [条件选择] [格式预览] [管理条件格式] [介绍] 类似我这种场景(见下图),单选选择不同的状态,有时为了一目了然的看清状态,需要给单元格加上不同的背景颜色,但手动使用格式刷比较麻烦,琢磨了下根据单元格选项动态…

【云原生】Nacos 监控手册

Nacos 0.8.0版本完善了监控系统,支持通过暴露metrics数据接入第三方监控系统监控Nacos运行状态,目前支持prometheus、elastic search和influxdb,下面结合prometheus和grafana如何监控Nacos,官网grafana监控页面。 搭建Nacos集群暴…

HTML入门零基础教程(六)

嗨,大家好,我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助,请支持一波。 希望未来可以一起学习交流。 目录 一、图像的路径 1.路径(前期铺垫知识) 2.VSCode打开目录文件夹: 3.路…

java计算机毕业设计ssm医院病床管理系统ft4fz(附源码、数据库)

java计算机毕业设计ssm医院病床管理系统ft4fz(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Kafka集群搭建

集群应用场景 (1)消息传递 Kafka可以很好地替代传统邮件代理。消息代理的使用有多种原因(将处理与数据生产者分离,缓冲未处理的消息等)。与大多数邮件系统相比,Kafka具有更好的吞吐量,内置的分…

Java项目:SSM会议室预约系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员与用户两种角色; 管理员角色包含以下功能: 管理员登陆,会议室管理,预约审核管理,用户注册等功能。 用…

半路出家的菜鸡程序员,北漂五年,给刚入行朋友的一些忠告,发自肺腑

从高中(s1)到大学(s7)打了7年的LOL,电一大师、网一王者,一度准备打职业。多的不再赘述,要知道,那些除了纪念和情怀,对我都不再有意义。 难以启齿,LOL算是陪伴…

【OpenCV学习】第8课:形态学操作-开丶闭丶形态学梯度丶顶帽丶黑帽

仅自学做笔记用,后续有错误会更改 理论 开:先腐蚀 后膨胀(效果:可以去掉小对象)闭:先膨胀 后腐蚀(效果: 可以填洞,去污渍)形态学梯度(基本梯度)&#xff1a…

委托(delegate)

委托(delegate) 委托概述 将方法调用者和目标方法动态关联起来,委托是一个类,所以它和类是同级的,可以通过委托来掉用方法,不要误以为委托和方法同级的,方法只是类的成员。委托定义了方法的类…

Flutter - DecoratedBox(装饰容器)及内部控件使用详解

DecoratedBox. 可以在其子组件绘制前(或后)绘制一些装饰(Decoration),如背景、边框、渐变等 比如 这样 这样 这样 // DecoratedBox 的源码 const DecoratedBox({super.key,required this.decoration, // Decorationthis.position Decor…

产品新说 | 重磅,刚刚正式发布

在当代术加持和需求迭代的背景下,运维人员更需要透过现象看本质,也就是通过复杂的表象数据去挖掘其背后的信息价值。而运维数据经过各种技术手段的治理后,通常的呈现方式是数据空间的形式,比如表格、纯文字等。为了更形象地表达数…

层次遍历二叉树

层次遍历二叉树 文章目录层次遍历二叉树♥ 做法♥算法构思♥ 数据结构设计♥ 层次遍历过程♥ 算法实现应用:用层次遍历求路径之逆♥ 问题♥ 解题思路:♥ 算法框架:♥ 算法实现♥ 做法 ▪ 逐层进行访问 ▪ 对某一层的节点访问完后,再按照其访问次序对各个节点的左、…

[附源码]Python计算机毕业设计SSM基于的在线怀旧电影歌曲听歌系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

MATLAB算法实战应用案例精讲-【神经网络】扩散模型(Diffusion Models)

前言 广播模型、扩散模型和传染模型可以用于分析信息、技术、行为、信念和传染病在人群中的传播。这些模型在通信科学、市场营销学和流行病学的研究中发挥着核心作用。 在计算机视觉中,生成模型是一类能够生成合成图像的模型。例如,一个被训练来生成人脸的模型,每次都会生…

Java项目:SSM电子书网站管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员、用户两种角色; 管理员角色包含以下功能: 登录页面,管理员管理书籍,用户管理等功能。 用户角色包含…

Docker学习笔记4(狂神)

DockerFile 很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像! 官方既然可以制作镜像,那我们也可以! DockerFile的构建过程 很多指令: 创建一个自己的centos: 我们可以看到我们从docke…

代码随想录训练营第四天

专题:链表 题目:两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 例如: 题目分析 要两两交换链表中的结…

python opencv 找到圆点标定板所有点后通过距离找两个角点6

先对大图中的标定板框选,然后再标定计算 工程目录结构 如果提示没有win32gui则 pip install pywin32 如果是conda的环境则 conda install pywin32 drawROI.py import copy import jsonimport cv2 import numpy as np import os import matplotlib.pyplot as plt f…