Redis 缓存一致性

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/bashtail -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.mzph.cn/news/861459.shtml

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

相关文章

idea中maven新增的配置文件xx.xml没生效问题

项目场景: 因为公司使用自己的私服下载jar,则没有使用默认的settings.xml文件。而是新增了一个settingsold.xml文件 问题描述 公司项目有用自己的私服,Maven正常去私服下载jar包是没问题的。但是一直是去找的阿里云镜像,到导致阿里云镜像找不到相关的jar包报错!!!…

前端:Nuxt2 + Vuetify2

想要开发一个网站,并且支持SEO搜索,当然离不开我们的 Nuxt ,那通过本篇文章让我们一起了解一下。如果构建一个Nuxt项目 安装 Nuxt,创建项目 安装nuxt2, 需要node v16,大家记得查看自己的node版本。构建脚…

Linux-笔记 OverlayFS文件系统小应用 恢复功能

前言 通过另一章节 OverlayFS文件系统入门 中已经大致了解了原理,这里来实现一个小应用。通过前面介绍我们已经知道lowerdir是只读层,upperdir是可读写层,merged是合并层(挂载点),那么我们可以利用这个机…

.NET C# 使用GDAL将mdb转换gdb数据

.NET C# 使用GDAL将mdb转换gdb数据 目录 .NET C# 使用GDAL将mdb转换gdb数据1 环境2 Nuget3 Code 1 环境 VisualStudio2022 .NET6 GDAL 3.8.5 2 Nuget 3 Code FeatureExtension.cs public static class FeatureExtension {[DllImport("gdal.dll", EntryPoint &…

【权威主办|检索稳定】2024年法律、教育与社会发展国际会议 (LESD 2024)

2024年法律、教育与社会发展国际会议 (LESD 2024) International Conference on Law, Education and Social Development in 2024 【重要信息】 大会地点:成都 官网地址:http://www.iclesd.com 投稿邮箱:iclesdsub-conf.com 【注意&#xff1…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

Renesas MCU使用SCI_I2C驱动HS3003

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 认识HS3003 1.2.1 HS3003特性 1.2.2 HS3003寄存器 1.2.2.1 温湿度数据寄存器 1.2.2.2 参数寄存器 1.2.2.3 一个参数配置Demo 1.2.3 温湿度值转换 1.2.4 HS3003应用电路 1.2.4.1 PIN引脚定义 1.2.4.2 sensor 应用电路 …

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…

【八股系列】Vue中的<keep-alive>组件:深入解析与实践指南

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【探索响应式布局的奥秘:关键技术与实战代码示例】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论…

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式(Regular Expression,常简写为regex、regexp或RE)是一种强大的文本处理工具,它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …

Shell 编程入门

优质博文&#xff1a;IT-BLOG-CN 【1】x.sh文件内容编写&#xff1a; 固定开头&#xff1a;#&#xff01;/bin/sh&#xff1b; 【2】学习的第一个命令就是echo输出的意思&#xff1b; 【3】其实shell脚本也就是在文件中写命令&#xff0c;但是我们要写的是绝对路径&#xff1a…

mysql岗位实习----教务系统管理

教务管理系统 一、DDL CREATE TABLE users (user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID,username varchar(50) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,gender enum(男,女) NOT NULL COMMENT 性别,email varchar(100) DEFAULT N…

C++初学者指南第一步---14.函数调用机制

C初学者指南第一步—14.函数调用机制 文章目录 C初学者指南第一步---14.函数调用机制1.记住&#xff1a;内存的结构2.函数调用是如何工作的3. 不要引用局部变量4. 常见编译器优化5. Inlining内联 1.记住&#xff1a;内存的结构 堆&#xff08;自由存储&#xff09; 用于动态存…

Redis-实战篇-缓存雪崩

文章目录 1、缓存雪崩2、解决方案&#xff1a; 1、缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 2、解决方案&#xff1a; 给不同的key的TTL添加随机值利用Redis集群提高服务的可用性…

华为电脑重装系统如何操作?电脑Win11系统重装注意什么?图文详细解答

随着科技的不断进步&#xff0c;操作系统更新换代的步伐也日益加快。华为电脑作为市场中的佼佼者&#xff0c;其搭载的Windows 11系统凭借其强大的性能和丰富的功能受到了用户的广泛好评。然而&#xff0c;随着使用时间的推移&#xff0c;系统可能会出现各种问题&#xff0c;如…

验证码技术 easy-captcha

依赖 <!-- easy-captcha用来生成验证码&#xff0c;由于jdk9以后&#xff0c;内置JavaScript去掉了&#xff0c;所以需要导入这个org.openjdk.nashorn --> <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</arti…

牛客挑战赛75 D. 不存在的玩家(sg图dp)

题目 思路来源 灵茶山群群友 https://blog.csdn.net/Code92007/article/details/110354429 题解 其实想了想&#xff0c;和20年小米邀请赛决赛这个G题的dp思路是一样的&#xff0c;姑且称为sg图dp吧 按sg值从大到小dp&#xff0c;每次补上全局sg值-1的这些点&#xff0c; …

网约车停运损失费:2、协商过程

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

Houdini 通过wedge来做模拟参数对比 (PDG TOP)

我们的设定如下例子 这是个简单的布料悬挂的例子。上方两个角分别被固定住了&#xff0c;然后在distance约束下布料下垂。 我们现在的目的是想要对比不同的streach stiffness对模拟的影响。 第一步&#xff1a;找到stiffness参数&#xff0c;右键expression->edit expre…