当前位置: 首页 > news >正文

如何实现Redis和Mysql中数据双写一致性

 在我们的实际开发中,我们用到了redis缓存一些常用的数据(如热点数据)用来提高系统的吞吐量。 但是不可以避免的出现了数据的修改场景,这就导致了数据库中的数据和Redis中出现不一致性的情况。如何保证数据一致性就显得非常重要了,下面介绍一下保证数据的双写一致性的方案。

   

1、先删缓存再操作数据库方案

    在redis一般写的场景下对数据的更新操作是不推荐使用的,推荐使用删除缓存数据的操作,因为删除操作的效率更高。下图展示先删除缓存再操作数据库的过程图:

图片

在这种方式下会存在数据不一致的问题,如下图所示:

图片

(1)线程1要更新数据,它先删除redis中的缓存数据,然后由于网络堵塞导致暂短的停顿,没有继续执行操作数据库 

(2)线程2要查询数据,首先查询数据库,但是由于Redis中的数据已经被线程1删除了,那么它会去数据库中查询数据X并且要将数据X同步到Redis中

(3)线程1网络堵塞结束,执行了数据库操作将数据X更改为Y

    经过上述的过程就导致了Redis的数据和数据库中的数据不一致了,即就是Redis中存放的依据是老数据。为了解决上述的问题,我们采用缓存延迟双删的策略,如下图所示的缓存延迟双删的过程:

图片

    采用缓存延迟双删策略最多在X毫秒内读取的数据是老数据,在X毫秒之后读取的数据都是最新的数据。X的具体值如何确定那就需要根据自身的业务了来确定。

    延迟双删策略只能保证最终的一致性,不能保证强一致性。由于对Redis的操作和Mysql的操作不是原子性操作,所以如果想保证数据的强一致性就需要加锁控制,如下图所示:

图片

    加锁之后势必会带来系统的吞吐量的下降,所以需要衡量利弊来确定是否使用加锁。

2、先操作数据库再删除缓存方案

图片

    此方案就是先操作数据库,数据库写入成功之后再来删除Redis缓存中的数据。多个线程之间的数据读取和更新如下图所示:

图片

    这种方案下,在数据库更新成功后到删除Redis缓存数据之前的这段时间中,其他线程读取的数据都是旧数据,等Redis删除缓存后会重新从数据库中读取最新数据同步到Redis,这样可以在一定程度上保证数据的最终一致性。极端情况下会出现数据不一致的情况,如下图所示:

图片

(1)线程1先成功的更新数据到数据库中,然后执行删除Redis缓存中的数据的时候失败了

(2)线程2要读取数据,此时优先从Redis中查询数据,由于此时Redis中老数据没有删除,所以线程2可以拿到旧数据直接返回。直到Redis中缓存的数据过期之后才可以从数据库中获取最新的到Redis中

3、删除重试机制

    无论是先删除缓存再操作数据还是先操作数据库再删除缓存的机制,都有可能会出现删除缓存失败的情况,如下图所示:

图片

    为了应对删除缓存失败的情况发生,于是加入了删除重试机制,如下图所示:

图片

    通过canal监听binlog感知数据的变动后,canal客户端执行删除Redis缓存数据,如果缓存数据删除失败那么发送一条MQ消息让canal客户端继续执行删除操作,这样可以保证数据的最终一致性。但是这样也增加了系统的复杂性。

4、总结:

(1)实际开发中推荐使用先操作数据库再删除缓存的方案,因为此方案最大程度上保证了数据的一致性并且实现也最简单。

(2)无论是先操作数据库再删除缓存还是先删除缓存再操作数据库都有可能会出现删除缓存失败的情况,所以需要加入删除重试机制。

(3)如果想要Redis和Mysql的数据强一致性,可以考虑使用加锁的方式实现。

5、实际应用

在实际应用中,我们一般会采取云服务器使用并处理实时同步RDS与Redis构建缓存一致性,可参考我的上一篇文章:实时同步RDS与Redis构建缓存一致性-CSDN博客

        通过DTS数据订阅能力,用户可以实时订阅RDS日志数据变更,并将其写入Redis以实现缓存数据的更新。这样的配置可以实现MySQL与Redis之间的缓存同步一致性,采用了Cache-Aside Pattern模式。通过DTS的服务化能力,用户可以保证高效、稳定和实时的数据同步。从而用户能够实现商品信息的实时同步,确保在系统中的商品信息始终是最新的。同时,对于账单信息的查询也能够变得高效,用户可以从Redis中获取已缓存的数据,减少对MySQL的频繁访问,提升查询性能。这样的解决方案不仅能够提高系统的响应速度,还能够保证数据的一致性和准确性,为用户提供更好的使用体验。

        我使用的服务器组合是云服务器ECS省钱攻略,可以试用。

        通过RDS MySQL+DTS+Redis的架构,实现RDS MySQL与Redis缓存之间的数据同步和一致性。通过实时同步MySQL数据库数据到Redis缓存,提高数据查询速度,降低数据库压力,确保业务数据的实时性和准确性。

相关文章:

如何实现Redis和Mysql中数据双写一致性

在我们的实际开发中,我们用到了redis缓存一些常用的数据(如热点数据)用来提高系统的吞吐量。 但是不可以避免的出现了数据的修改场景,这就导致了数据库中的数据和Redis中出现不一致性的情况。如何保证数据一致性就显得非常重要了&…...

three.js 模型高亮效果实现说明(结合react)

three.js react 实现鼠标移入模型高亮选中效果 使用EffectComposer和其附加的渲染效果Passes(如RenderPass和OutlinePass)来实现高级渲染效果。首先创建EffectComposer实例,并添加RenderPass和OutlinePass,最后在渲染循环中调用…...

入营测评题解

第一题&#xff1a;first 第二题&#xff1a;chengji 打擂台&#xff0c;每个数跟当前最大、最小值比较&#xff0c;维护当前最值即可。 #include<bits/stdc.h> using lllong long; using namespace std;const int N1e610;int n; int x;//1e9, ll最大9e18 ll maxn0,minn…...

制造知识普及(十)-- 常见的工业软件介绍

「 1. ERP」 企业资源计划&#xff08;enterprise resource planning&#xff0c;ERP&#xff09;是制造企业的核心管理软件。ERP系统的基本思想是以销定产&#xff0c;协同管控企业的产、供、销、人、财、物等资源&#xff0c;帮助企业按照销售订单&#xff0c;基于产品的制造…...

Windows系统设置网络IPv4和IPv6优先访问级

Windows系统设置网络IPv4和IPv6优先访问级 资源宝整理分享&#xff1a;www.httple.net 在数字化的世界中&#xff0c;我们离不开互联网&#xff0c;而互联网协议&#xff08;IP协议&#xff09;则扮演着至关重要的角色。IPv4曾是互联网的主要标准&#xff0c;但随着IP地址枯竭问…...

yolov8 剪枝 - DepGraph

2024年8月5 5000张图片&#xff0c;2个类别。 yolov8n 初始&#xff1a; 185 layers, 3151904 parameters, 31936 gradients, 8.7 GFLOPs 经过三次finetune后&#xff1a; 185 layers, 2327024 parameters, 31936 gradients, 6.6 GFLOPs 经过第四次fintune后&#xff1a; …...

【网络】套接字socket编程预备知识

1.源IP地址和目的IP 计算机网络中的源地址和目的地址是用来标识网络中的不同主机的。 源地址是指发送数据包的主机的地址&#xff0c;而目的地址则是指接收数据包的主机的地址&#xff0c;在数据包传输过程中&#xff0c;每经过一个路中器感交换机&#xff0c;都会根据目的地址…...

【学习笔记】Day 8

写在开头&#xff1a; 最近老板突然提出一个全新的组会主题&#xff0c;是关于 “最近我犯的傻”&#xff0c;其目的在于提供乐子的同时引以为戒。本来我还在愁到底去哪里找干的啥事儿&#xff0c;结果今天直接拉了个大的。什么叫无心插柳柳成荫啊&#xff0c;悲。 一…...

springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice

一、 背景 因为项目中需要使用word转pdf功能&#xff0c;因为转换速度原因&#xff0c;最后选用了libreoffice&#xff0c;原因及部署请参考 linux ubuntu环境安装libreoffice&#xff0c;word转pdf 远程调用的话可选docker部署&#xff0c;请看2.3.1 二、springboot整合libr…...

从入门到精通:大学生编程技能提升全攻略

文章目录 每日一句正能量前言编程语言选择编程语言选择&#xff1a;为新手导航Python&#xff1a;初学者的友好伙伴JavaScript&#xff1a;Web开发的核心Java&#xff1a;企业级应用的经典C&#xff1a;系统编程的基石Ruby&#xff1a;优雅高效的编程Swift&#xff1a;iOS开发的…...

C# .NET Framework的特殊委托

C# .NET Framework的特殊委托 .NET Framework中定义了几种特殊的委托类型&#xff0c;以简化委托的使用。以下是一些常用的特殊委托类型&#xff1a; Predicate<T> 这是一个返回布尔值的委托&#xff0c;接受一个类型为T的参数。常用于定义过滤条件。 using System; …...

C# 判断电脑是否联网

项目中连接webAPI需要判断是否联网&#xff0c;故找到这个方法&#xff0c;不需要引用任何dll&#xff0c;代码复制一下&#xff0c;直接使用。wininet.dll是系统自带的 public void Initial(){try{ if (IsNetworkConnected){SvMaster.Log.WriteInfo("网络…...

爬虫解析代码结构

在设计中加入一个顶层接口是有益的&#xff0c;特别是当您希望实现统一的接口来处理所有类型的排行榜数据时。这样做可以提供更好的灵活性和扩展性&#xff0c;同时保持代码的整洁和易于维护。 设计概述 接口: 定义一个 RankingDataCollector 接口&#xff0c;它定义了所有数…...

day 23 进程间通信—管道

注意事项&#xff1a; 1、如果管道中至少有一个写端&#xff1a; 如果管道中有数据,直接读出 如果管道中没有数据&#xff0c;会阻塞等待直到有数据写入后读出 2、如果管道中没有写端&#xff1a; 如果管道中有数据&#xff0c;直接…...

Python酷库之旅-第三方库Pandas(073)

目录 一、用法精讲 296、pandas.Series.dt.as_unit方法 296-1、语法 296-2、参数 296-3、功能 296-4、返回值 296-5、说明 296-6、用法 296-6-1、数据准备 296-6-2、代码示例 296-6-3、结果输出 297、pandas.Series.dt.days属性 297-1、语法 297-2、参数 297-3、…...

使用easyexcel导出,发生了Exception: could not find acceptable repesentation

报错信息&#xff1a; 原因以及解决方案&#xff1a; 原因是我的代码使用Resp响应返回实体&#xff0c;其实使用EasyExcel导出已经设置了响应编码&#xff0c;导致重复了。 当你通过 HttpServletResponse 的输出流写入文件时&#xff0c;你已经直接控制了响应体。如果此时还尝…...

android display 笔记(五)HWC(Hardware Composer)

HWC 简单来说HWC是用来合成图形和显示图形的&#xff0c;可以把多个图形缓存传给硬件混合渲染器&#xff0c;让硬件混合渲染器执行合成操作&#xff0c;显示图形就是直接将图形缓存显示到屏幕。 android 14 /hardware/interfaces/graphics/composer/2.1/IComposer.hal 19 im…...

【模电笔记】——集成运算放大电路

tips&#xff1a;本章节的笔记已经打包到word文档里啦&#xff0c;建议大家下载文章顶部资源&#xff08;有时看不到是在审核中&#xff0c;等等就能下载了。手机端下载后里面的插图可能会乱&#xff0c;建议电脑下载&#xff0c;兼容性更好且易于观看&#xff09;&#xff0c;…...

Android Studio Gradle多渠道打包

原理使用Android Studio打一次渠道包&#xff0c;用反编译工具反编译后&#xff0c;修改渠道信息重新编译 准备文件 分渠道配置文件&#xff1a;channel.txt ↓ # 多渠道配置里“统计平台”、“市场名称”、“渠道编号”分别代表什么意思&#xff1f; # 统计平台&#xff1a;…...

什么是DNS缓存?DNS缓存有哪些作用和危害?

在互联网世界的运转机制中&#xff0c;DNS&#xff08;域名系统&#xff09;是其中的关键&#xff0c;而DNS缓存则是这一系统的重要环节。它既能加快网站的访问速度&#xff0c;同时也会对网络安全造成影响&#xff0c;因此了解DNS缓存对于网站的日常管理至关重要。 什么是DNS…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...