Redis 缓存一致性

news2024/11/18 7:29:48

Redis 业务结构

在这里插入图片描述
流程图

在这里插入图片描述

缓存一致性

Redis 和 MySQL 中数据保持一致

双检加锁策略

主要用于解决多线程环境下的并发问题,确保在高并发场景下对共享资源的访问是互斥的,避免因竞争条件导致的不一致状态

public User findUserById(Integer id) {
	User user = null;
	String key = CACHE_KEY_USER + id;
	
	user = (User) redisTemplate.opsForValue().get(key);
	if (user == null) {
		// 处理缓存击穿
		synchronized (UserService.class) {
			user = (User) redisTemplate.opsForValue().get(key);
			if (user == null) {
				user = userMapper.selectByPrimaryKey(id);
				if (user == null) {
					// 缓存null,处理缓存穿透
					redisTemplate.opsForValue().setIfAbsent(key, null, 7L, TimeUnit.DAYS);
				} else {
					// mysql里面有数据的,需要回写redis,完成数据一致性的同步工作
					redisTemplate.opsForValue().setIfAbsent(key, user, 7L, TimeUnit.DAYS);
				}
			}
		}
	}
	return user;
}

缓存都要设置超时时间的原因

因为业务一般以MySQL的数据为准,给缓存设置过期时间,定期清理,可以保证最终一致性

缓存一致性的实现

延时双删
先删除缓存 + 更新数据库 + 再删除缓存

分布式锁
保证只有一个线程能持有资源,避免数据不一致

异步通知
canal ,监控mysql binlog,当bin log更新时,同步到redis

MySQL主从复制原理

在这里插入图片描述

canal 工作原理

1、canal 模拟MySQL 交互协议,把自己伪装成 slave
2、canal 读取到 mysql 的bin log 并解析
3、执行自定义操作,如 对Redis 进行相同的变更

canal 缓存一致性实践

添加主从用户

MySQL添加 canal 用户,(测试也可以直接使用 root用户)

DROP USER IF EXISTS 'canal'@'%';
create user 'canal'@'%' identified by 'canal';
grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%';
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';
FLUSH PRIVILEGES;

修改MySQL配置文件

修改MySQL配置文件,开启 bin_log
my.cnf

在这里插入图片描述

下载 canal

docker pull canal/canal-server

启动 canal

从镜像获取配置文件 => 修改配置文件 => 开启新镜像

# 第一遍 不挂载 获取配置文件
docker run -p 11111:11111 --name canal -d canal/canal-server:latest


# 复制配置文件
docker cp df67a55b855d:/home/admin/canal-server/conf/example/instance.properties  /usr/local/canal/conf/

# 删除原来的容器 
docker rm $(doc ker stop canal)

# 挂载启动新容器
docker run -p 11111:11111 --name canal \
-v /usr/local/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-d canal/canal-server:latest

通过日志查看 canal 服务状态

如果出问题,这里可以看到信息

docker exec -it canal /bin/bash

tail -f /home/admin/canal-server/logs/example/example.log
在这里插入图片描述

配置 canal

在这里插入图片描述

1、这里的 canal.instance.mysql.slaveId 与 前面 MySQL配置的server_id 不同即可

2、master.address 填 mysql 地址

3、canal 连接 mysql的账密

4、canal 监控的 mysql 库表

5、这里的canal.mq、topic 对应后续代码实践的 destination

在这里插入图片描述 在这里插入图片描述

Java 业务代码

gitee 业务代码

canal 效果演示

建表

CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `userName` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4

插入数据前

在这里插入图片描述

MySQL 插入数据

insert into bigdata.t_user VALUES (1, 'zhangsan'), (2, 'lisi');

业务代码监控

在这里插入图片描述

插入数据后

在这里插入图片描述

bin log 内容查看

show variables like 'log_bin';

在这里插入图片描述

show binary logs;

在这里插入图片描述

show master status;

在这里插入图片描述

show binlog events in 'mysql-bin.000006';
在这里插入图片描述

返回值字段说明:

  • Log_name:查询的binlog文件名
  • Pos:pos起始位置
  • Event_type:事件类型
  • Server_id:服务器ID,my.cnf 进行设置
  • End_log_pos:pos结束点
  • Info:日志说明

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

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

相关文章

金航标和萨科微公司发展历程

金航标kinghelm(www.kinghelm.com.cn)和萨科微slkor总经理宋仕强介绍公司发展发展历程时说,2015年萨科微与韩国延世大学团队当年萨科微碳化硅功率器件、SiC MOS、SiC SBD成功量产,2016年萨科微在中国大陆成功注册“Slkor”商标&am…

Build with Claude:价值 3 万美元 API 积分

只要在 6 月 26 日至 7 月 10 日创建一个基于 Anthropic API 的应用,并在这里提交,前三名可瓜分 3 万美元的 Anthropic 积分。

国企:中国电信天翼物联 2025届实习生招聘 二

5G解决方案工程师(南京实习生) 应聘资格要求 岗位职责 负责5G确定专网在工业、能源行业解决方案设计。 专业、能力要求 通信相关专业,有社团组织经验。 报名地址https://young.yingjiesheng.com/xyzlogin?ctmid=ac22e6c2-8b55-41ab-86c1-f530d5cb9218&ehirejobid=1558…

LeetCode 算法:验证二叉搜索树 c++

原题链接🔗:验证二叉搜索树 难度:中等⭐️⭐️ 题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于…

202486读书笔记|《格里格外》——活在当下,享受当下

202486读书笔记|《格里格外》——活在当下,享受当下 《格里格外》天然绘著,看的作者的上一本书是《生活蒙太奇》,生活里或遇见,或想象的画面,定格那一刻,让景色时间都有了更丰富的意义。 感动又欣喜&#…

存储故障导致Oracle 19c 数据文件处于recover状态的恢复案例

1.背景 某次平台分布式存储故障,导致数据库出现ORA-00376、ORA-01110数据文件不可读报错,本文将整个恢复过程进行整理记录。 2.报错信息 在进行租户数据库打开操作时,出现了如下报错: ORA-00376: file 17 cannot be read at t…

【项目实训】前端页面初探索(前期探索)

前期&#xff0c;由于没有确定页面展示形式&#xff0c;于是进行了很多探索 首先安装element-ui 导入elemnt-plus 添加use: 设置一个全局样式 编写导航栏 <el-menu:default-active"activeIndex"class"el-menu-demo"background-color"#95d475&quo…

【SpringBoot Web框架实战教程(开源)】01 使用 pom 方式创建 SpringBoot 第一个项目

导读 这是一系列关于 SpringBoot Web框架实战 的教程&#xff0c;从项目的创建&#xff0c;到一个完整的 web 框架&#xff08;包括异常处理、拦截器、context 上下文等&#xff09;&#xff1b;从0开始&#xff0c;到一个可以直接运用在生产环境中的web框架。而且所有源码均开…

SAP ERP公有云(全称 SAP S/4HANA Cloud Public Edition),赋能企业成为智能可持续的企业

在数字化浪潮中&#xff0c;每一家企业都需要应对快速的市场变化&#xff0c;不断追求降本增效&#xff0c;为创新提供资源&#xff0c;发展新的业务模式&#xff0c;安全无忧地完成关键任务系统的转型。 10年前&#xff0c;SAP进入云领域&#xff0c;用云ERP和覆盖全线业务的云…

负载组指南说明-负载柜

什么是负载组&#xff1f; 负载组是一种设备&#xff0c;旨在准确模拟电源在实际应用中看到的负载。这种负载组可以用电阻、电感或电容元件构建。它是一种电阻装置&#xff0c;以热量的形式消散一定量的能量&#xff0c;可以通过自然对流、强制空气或水冷系统去除。 为什么要使…

嵌入式工程师从0开始,到底该学什么,怎么学

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;嵌入式是个大筐&#xff0…

ERP收费模式是怎样的?SAP ERP是如何收费的?

一、购置SAP ERP系统的费用组成 1、软件费用 传统的ERP系统大多为许可式&#xff0c;即企业在购买ERP服务时付清所有费用&#xff0c;将ERP系统部署于自己的服务器中。根据所购买ERP系统品牌的不同&#xff0c;价格上也有一定的差异。采购ERP系统许可后&#xff0c;后续维护、…

【计算机毕业设计】092基于微信小程序二手闲置交易市场

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

基于幅值判断的工频故障分量距离保护

统的继电保护原理是基于工频电气量的&#xff0c;但近年来&#xff0c;反应故障分量的高速继电保护原理在微机保护装置中被广泛应用。故障分量只在设备发生故障时才出现&#xff0c;因此可以用叠加原理来分析其特征。 将电力系统发生的故障视为非故障状态与故障附加状态的叠加…

vant组件 顶部下拉刷新和页面底部下拉获取数据+顶部搜索框

1.html部分&#xff08;顶部tab切换无&#xff0c;只有主体list部分&#xff09; <div class"yd" ><!-- yd端 --><!-- 搜索框 --><van-searchv-model"ydsearchvalue"show-actionplaceholder"请输入搜索关键词"search"…

供应链攻击是什么?

随着企业对技术和连接性的依赖日益增加&#xff0c;以及对第三方的普遍依赖&#xff0c;供应链攻击变得越来越普遍。这些攻击旨在通过供应商和商业伙伴损害企业。 供应链攻击可能对企业和组织构成重大威胁&#xff0c;因为它们可能危及它们的安全以及向客户提供的产品和服务的…

【笔记】事务隔离级别以及MVCC解决幻读

事务提交可能碰到的问题&#xff1a; &#xff08;1&#xff09;脏读&#xff1a;事务1对数据进行修改但还没提交&#xff0c;事务2读取修改后的数据&#xff0c;之后事务1执行错误&#xff0c;回滚了&#xff0c;此时事务2的数据是错误的脏数据。 &#xff08;2&#xff09;不…

Stm32的DMA的学习

一&#xff0c;介绍 二&#xff0c;DMA框图 三&#xff0c;DMA通道 四&#xff0c;相关HAL库函数 五&#xff0c;配置DMA 六&#xff0c;Stm32CubeMX配置 【13.1】减少CPU传输负载 DMA直接存储器访问—Kevin带你读《STM32Cube高效开发教程基础篇》_哔哩哔哩_bilibili

Shell (一)Ubuntu的网络配置及软件安装

Ubuntu的配置及软件安装 网络配置 虚拟机提供的网络类型 桥接模式 主机和虚拟机分别拥有不同的ip地址&#xff0c;可以实现和外界设备通信 NAT模式 也可以联网&#xff0c;但是和主机共用同一个ip地址&#xff0c;外界无法识别虚拟机和主机发送的信息 仅主机模式 虚拟机不可…

Python学习笔记23:进阶篇(十二)常见标准库使用之日期时间功能datetime模块的学习使用

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 日期和时…