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 往文件中写日志函数 C语言

函数的参数:想往日志里写什么就加什么参数 改完参数记得更改sprintf()中的参数 下面代码写在日志中的格式: 时间|进程绝对路径|IP|端口|结果 void writeRecord(const char* bufTime,const char* processPath,const char* ip,const char* port,const char* ret) {char* reco…

4.Spring Context 装载过程源码分析

Spring的ApplicationContext是Spring框架中的核心接口之一,它扩展了BeanFactory接口,提供了更多的高级特性,如事件发布、国际化支持、资源访问等。ApplicationContext的装载过程是Spring框架中非常重要的一个环节。以下是ApplicationContext装…

Adam优化器:深度学习中的自适应方法

引言 在深度学习领域,优化算法是训练神经网络的核心组件之一。Adam(Adaptive Moment Estimation)优化器因其自适应学习率调整能力而受到广泛关注。本文将详细介绍Adam优化器的工作原理、实现机制以及与其他优化器相比的优势。 深度学习优化…

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…

DOPE-PEG2000-FITC荧光特性

DOPE-PEG2000-FITC作为一种荧光标记分子,在生物医学领域应用。其荧光特性为生物成像和药物追踪提供了工具应用 FITC,作为荧光团,在受到特定波长的光激发时,能够吸收光能并转化为荧光发射。这一过程中,FITC分子从基态跃…

lombok相关注解

Accessors https://blog.csdn.net/sunnyzyq/article/details/119992746EqualsAndHashCode(callSuper false) https://blog.csdn.net/xiebeixb/article/details/105070222

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…

【面试系列】JavaScript 高频面试题

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

【八股系列】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; 用于动态存…