redis和mysql数据一致性方案

在这里插入图片描述
请求 A 更新数据 请求B读数据
在高并发情况下,A、B请求过程步骤相互穿插,就会出现图中的问题。

期望redis 的数据是11,最后变成了10

场景:先删除Redis,再更新 MySQL,不主动更新Redis,访问redis 没有数据,再访问MySQL 把数据回写到Redis。

在这里插入图片描述
请求 A、B 都是更新 Redis,然后再更新MySQL

在高并发情况下,如果请求 A 在更新MySQL 时卡了一会,请求 B 已经依次完成数据的更新,就会出现图中的问题。

期望redis 的数据是11,最后变成了10

分析:MySQL事物功能比Redis强大,可以严格保证原子性。 Redis宕机可能会丢失部分数据。以Redis为主处理异常成本高。

在这里插入图片描述
请求 A、B 都是先写 MySQL,然后再写 Redis

在高并发情况下,如果请求 A 在写 Redis 时卡了一会,请求 B 已经依次完成数据的更新,就会出现图中的问题。

期望redis 的数据是11,最后变成了10

场景:以MySQL 为主,事物成功,才更新Redis,

在这里插入图片描述
对于上面这种情况,对于第一次查询,请求 B 查询的数据是 10,但是 MySQL 的数据是 11,
存在这一次不一致的情况,对于不是强一致性要求的业务,可以容忍。
秒杀业务、库存服务等,需要考虑这个风险点。

在这里插入图片描述
这里需要满足条件:
1、缓存刚好自动失效或者删除;
2、B C请求同时访问,key未命中
3、B查询MySQL数据回写到redis 10。
4、A请求更新MySQL 为11 并且删除缓存
5、C回写之前的数据10。
因为正常情况更新MySQL 要比更新Redis耗时要长,这种情况发生概率极低, 在服务高负载情况下可能发生。
在这里插入图片描述
请求 A 更新数据 请求B读数据
在高并发情况下,A、B请求过程步骤相互穿插,如果“删除缓存 10”必须在“回写缓存10”前面会有异常。

期望redis 的数据是11,可能最后变成了10

优化:“删除缓存 10”必须在“回写缓存10”后面,为了让请求 A 的最后一次删除,等待一段时间,缺点可能会有性能问题造成进程排队。
场景: 先删除 Redis,更新 MySQL,再删除 Redis,用户读redis 没数据再访问MySQL回写Redis

在这里插入图片描述
通过消息队列的异步串行,实现最后一次删除。
删除失败加重试
尽量不用sleep 的方式,可能有性能风险。

在这里插入图片描述
这个方案可以保证数据最终一致性,但是带来了性能问题。对数据一致性比较敏感的服务可以采用这个方案。

在这里插入图片描述
这个方案,会保证 MySQL 和 Redis 的最终一致性,
但是如果中途请求 B 需要查询数据,如果缓存无数据,就直接查 DB;
如果缓存有数据,查询的数据也会存在不一致的情况。

总结:
除非读也要加锁, 不论采用那种方案极端情况下都会有某一个时刻数据不一致的情况。从技术上来说,无法保证Redis 和数据库的严格一致,所有的方案都是尽可能降低不一致的可能性和不一致时间。
方案4,5 加redis key设置过期时间 可以实现数据的最终一致。
方案6 牺牲了性能保证了数据最终一致性。
方案7 既保证了性能又能保证数据最终一致性,引入的中间件多,维护成本高。
方案6和方案7 因为所有的更新都会同步更新 redis ,redis 存储了所有数据,对redis内存空间要求大。

备注:绘图工具。
https://excalidraw.com/

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

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

相关文章

#ESP32S3R8N8建立工程(VSCODE)

1.参考文档 【立创ESP32S3R8N8】IDF入门手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g 2.建立工程 3.运行效果

2024年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲…

No system certificates available. Try installing ca-certificates.

一、错误重现 Certificate verification failed: The certificate is NOT trusted. No system certificates available. Try installing ca-certificates. 具体如图 系统环境是ubuntu:22.04 ARM架构 二、解决方法 1、先不要更换镜像源 直接设置 apt update apt -y instal…

创新实训2024.04.24日志:RAG技术初探

1. 什么是RAG技术 RAG is short for Retrieval Augmented Generation。结合了检索模型和生成模型的能力,以提高文本生成任务的性能。具体来说,RAG技术允许大型语言模型(Large Language Model, LLM)在生成回答时,不仅依…

13. Spring AOP(一)思想及使用

1. 什么是Spring AOP AOP的全称是Aspect Oriented Programming,也就是面向切面编程,是一种思想。它是针对OOP(面向对象编程)的一种补充,是对某一类事情的集中处理。比如一个博客网站的登陆验证功能,在用户进行新增、编辑、删除博…

算法设计优化——有序向量二分查找算法与Fibonacci查找算法

文章目录 0.概述1.语义定义2. 二分查找(版本A)2.1 原理2.2 实现2.3 复杂度2.4 查找长度 3.Fibonacci查找3.1 改进思路3.2 黄金分割3.3 实现3.4 复杂度分析3.5 平均查找长度 4. 二分查找(版本B)4.1 改进思路4.2 实现4.3 性能4.4 进…

YOLOv8常见水果识别检测系统(yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频(常见水果识别(yolov8模型,从图像、视频和摄像头三种路径识别检测)_哔哩哔哩_bilibili) 资源包含可视化的水果识别检测系统,可识别图片和视频当中出现的六类常见的水果,包括&#xf…

【redis】非关系型数据库——Redis介绍与安装(windows环境)

目录 数据库架构的演化单体架构缓存(Memcached)MySQL集群缓存(Memcached可以)MySQL集群垂直拆分(主从复制,读写分离)缓存(Redis)MySQL集群垂直拆分分库分表 NoSQLNoSQL产生的背景性能需求MySQL的扩展性瓶颈方面什么是NoSQLNoSQL的特点主流的N…

下级平台级联EasyCVR视频汇聚安防监控平台后,设备显示层级并存在重复的原因排查和解决

视频汇聚平台/视频监控系统/国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,平台支持7*24小时实时高清视频监控,能同时…

C语言进阶|单链表的实现

✈链表的概念和结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 链表的结构跟火车车厢相似,淡季时车次的车厢会相应减少,旺季时车次的车厢会额外增加几节。…

BSV区块链协会上线首个版本的ARC交易处理器

​​发表时间:2024年3月28日 BSV区块链协会近期上线了首个版本的ARC交易处理器。ARC是一项区块链交易处理服务,能在通过P2P网络广播交易之前验证并存储相关的交易。一旦新区块被挖出,一条与该交易相关的Merkle路径将被发回给交易发起者作为确…

长效静态代理IP如何改变你的SEO和网络营销策略?

长效静态代理IP为SEO和网络营销专家提供了一个强大的工具,通过这种技术,可以突破传统的限制,以全新的视角和方法优化其在线策略。这不仅增强了企业的市场竞争力,也为实现更高效、更精准的营销目标提供了可能。 一、长效静态代理IP…

Vue面试经验

Vue编译时声明周期的执行顺序 Vue中父子组件渲染顺序(同步引入子组件:import Son from ‘/components/son’ ) 父子组件编译时的生命周期执行顺序 这里修改data数据时也修改了dom,如过知识通过按钮对数据进行操作,那…

kafka大数据采集技术实验(未完待续)

Kafka环境搭建 下载地址:https://link.zhihu.com/?targethttps%3A//kafka.apache.org/downloads解压启动zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties需要注意的是 : " c o n f i g / z o o k e e p e r . p r o p e r t i e s &q…

解密Java线程池源码

一、线程池中的保活和回收源码分析 1、线程池中线程的创建时机 1、核心线程创建时机 在研究线程池的源码前首先想一个问题 public class Main {public static void main(String[] args) {ThreadPoolExecutor executor new ThreadPoolExecutor(10, 20, 0l, TimeUnit.MILLIS…

从Linux角度具体理解程序翻译过程-----预处理、编译、汇编、链接

目录 前言: 翻译过程 1.预处理 2.编译 3.汇编 4.链接 Linux下对其理解: 1.预处理 拓展: Linux下文件信息: 文件类型: 硬链接数: 文件拥有者: 文件所属组: other&#x…

区块链安全应用-------压力测试

基于已有的链进行测试(build_chain默认建的链 四个节 点): 第一步:搭链 1. 安装依赖 在ubuntu操作系统中,操作步骤如下: sudo apt install -y openssl curl 2. 创建操作目录, 下载安装脚本 ## 创建操作…

3个比较不错的Linux云音乐应用程序整理

在现代音乐流媒体时代,基于云的音乐应用程序因其便利性和可访问性而变得非常流行。Linux 用户尤其寻求可靠且功能丰富的音乐播放器来无缝地享受他们喜爱的音乐。 在这里,我们探讨了三个最好的基于云的音乐应用程序,每个应用程序都提供专为 L…

Java Web 网页设计(1)

不要让追求之舟停泊在幻想的港湾 而应扬起奋斗的风帆 驶向现实生活的大海 网页设计 1.首先 添加框架支持 找到目录右键添加 找到Web Application选中 点击OK 然后 编辑设置 找到Tomcat--local 选中 点击OK 名称可以自己设置 找到对应文件夹路径 把Tomcat添加到项目里面 因为…

【Hadoop】-HDFS的Shell操作[3]

目录 前言 一、HDFS集群启停命令 1.一键启停脚本可用 2.独立进程启停可用 二、文件系统操作命令 1、创建文件夹 2、查看指定目录下内容 3、上传文件到HDFS指定目录下 4、查看HDFS文件内容 5、下载HDFS文件 6、拷贝HDFS文件 7、追加数据到HDFS文件中 8、HDFS数据移…