Redis和Mysql的数据一致性问题

在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以我们都会用Redis来做数据的缓存,削减对数据库的请求的频率。

但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。

1、导致数据不一致的原因 

  1. 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。

  2. 所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。

  3. 读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。

  4. 这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。

1.1、缓存先后删除问题

不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。

1.2、先删除缓存

  1. 如果先删除Redis缓存数据,然而还没有来得及写入MySQL,另一个线程就来读取。

  2. 这个时候发现缓存为空,则去Mysql数据库中读取旧数据写入缓存,此时缓存中为脏数据。

  3. 然后数据库更新后发现Redis和Mysql出现了数据不一致的问题。

1.3、后删除缓存

  1. 如果先写了库,然后再删除缓存,不幸的写库的线程挂了,导致了缓存没有删除

  2. 这个时候就会直接读取旧缓存,最终也导致了数据不一致情况

  3. 因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题

2、解决方案

2.1、延时双删策略

2.1.1、基本思路

在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。

伪代码如下:

public void write(String key, Object data)
{redis.delKey(key);db.updateData(data);Thread.sleep(500);redis.delKey(key);
}
2.1.2、具体步骤
  1. 先删除缓存

  2. 再写数据库

  3. 休眠xxx毫秒(根据具体的业务时间来定)

  4. 再次删除缓存

2.1.3、设置缓存过期时间是关键点
  1. 从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案

  2. 所有的写操作以数据库为准,只要到达缓存过期时间,缓存删除

  3. 如果后面还有读请求的话,就会从数据库中读取新值然后回填缓存

2.1.4、方案缺点

结合双删策略+缓存超时设置,这样最差的情况就是:

  1. 在缓存过期时间内发生数据存在不一致

  2. 同时又增加了写请求的耗时。

2.2、异步更新缓存(基于Mysql binlog的同步机制)

2.2.1、整体思路
  1. 涉及到更新的数据操作,利用Mysql binlog 进行增量订阅消费

  2. 将消息发送到消息队列

  3. 通过消息队列消费将增量数据更新到Redis上

  4. 操作情况

读取Redis缓存: 热数据都在Redis上

写Mysql: 增删改都是在Mysql进行操作

更新Redis数据: Mysql的数据操作都记录到binlog,通过消息队列及时更新到Redis上

2.2.2、Redis更新过程

数据操作主要分为两种:

  1. 一种是全量(将所有数据一次性写入Redis)

  2. 一种是增量(实时更新)

这里说的是增量,指的是mysql的update、insert、delate变更数据。

读取binlog后分析 ,利用消息队列,推送更新各台的redis缓存数据。

  1. 这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis

  2. Redis再根据binlog中的记录,对Redis进行更新

  3. 其实这种机制,很类似MySQL的主从备份机制,因为MySQL的主备也是通过binlog来实现的数据一致性

3、总结

在高并发应用场景下,如果是对数据一致性要求高的情况下,要定位好导致数据和缓存不一致的原因。

解决高并发场景下数据一致性的方案有两种,分别是延时双删策略和异步更新缓存两种方案。

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

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

相关文章

​​SQLiteC/C++接口详细介绍之sqlite3类(十一)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:​​SQLiteC/C接口详细介绍之sqlite3类(十) 下一篇:​​SQLiteC/C接口详细介绍之sqlite3类(十二)(未发表) 33.sq…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)下篇

onRequestSelected onRequestSelected(callback: () > void) 当Web组件获得焦点时触发该回调。 示例: // xxx.ets import web_webview from ohos.web.webviewEntry Component struct WebComponent {controller: web_webview.WebviewController new web_webv…

鸿蒙开发实现弹幕功能

鸿蒙开发实现弹幕功能如下: 弹幕轮播组件:BannerScroll import type { IDanMuInfoList, IDanMuInfoItem } from ../model/DanMuData //定义组件 Component export default struct BannerScroll {//Watch 用来监视状态数据的变化,包括&#…

如何通过小程序上的产品力和品牌力提升用户的复购能力?

随着网络购物小程序的发展以及内容电商、社交电商、垂直电商、品牌自营等多个细分类型的出现,小程序成为用户日常购物、大促囤货以及首发抢购的重要场景,市场竞争也逐渐激烈。如何在用户侧获得更多转化、留存与复购,成为企业品牌日益关注的话…

在Linux/Ubuntu/Debian中使用windows应用程序/软件

Wine 是一个兼容层,允许你在类 Unix 操作系统(包括 Ubuntu)上运行 Windows 应用程序。 以下是在 Ubuntu 上安装和使用 Wine 的基本步骤: 在 Ubuntu 上安装 Wine: 更新软件包列表: 打开终端并运行以下命令以…

服务器机器学习环境搭建(包括AanConda的安装和Pytorch的安装)

服务器机器学习环境搭建 1 服务器与用户 在学校中,我们在学校中是以用户的身份进行访问学校的服务器的。整体框架大致如下: 我们与root用户共享服务器的一些资源,比如显卡驱动,Cuda以及一些其他的公共软件。 一般情况下&#…

(一)、机器人时间同步方案分析

1、是否有必要进行时间同步 目前的自动驾驶系统包括 感知、定位、决策规划、控制 等模块,这些模块的正常运行需要依靠各种不同类型的传感器数据的准确 融合。尤其是激光雷达与相机这两种传感器在感、知定位模块中起着至关重要的作用。机械式旋转扫描激光雷达本身较低…

单链表OJ题:LeetCode--141.环形链表

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中的第141道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏:数据结构与算法 个 …

Linux 常用命令100+

Linux 运维/开发/测试 常用命令100(v1.1) 帮助命令(2个) 命令功能说明示例man 命令查看普通命令帮助,命令的词典,更复杂的还有info,但不常用。rootbrLinux ~]#man lshelp 命令查看Linux内置命令的帮助,比如cd命令。[rootbrLinux…

ISIS接口认证实验简述

默认情况下,ISIS接口认证通过在ISIS协议数据单元(PDU)中添加认证字段,例如:一个密钥或密码,用于验证发送方的身份。 ISIS接口认证防止未经授权的设备加入到网络中,并确保邻居之间的通信是可信的…

Spring学习

Maven 的配置文件是一个强约定的XML格式文件&#xff0c;它的文件名一定是pom.xml。 1、POM (Project Object Model) 一个 Java 项目所有的配置都放置在 POM 文件中&#xff0c;大概有如下的行为&#xff1a; 定义项目的类型、名字管理依赖关系定制插件的 1.maven坐标 <…

使用html+css制作一个发光立方体特效

使用htmlcss制作一个发光立方体特效 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Documen…

基于SpringBoot SSM vue办公自动化系统

基于SpringBoot SSM vue办公自动化系统 系统功能 登录 个人中心 请假信息管理 考勤信息管理 出差信息管理 行政领导管理 代办事项管理 文档管理 公告信息管理 企业信息管理 会议室信息管理 资产设备管理 员工信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: S…

如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 前一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 后一篇&#xff1a; 警告&#xff1a; 本教程可以包含过时的信息。 我在这里描述的所有内容都将适用于 OpenCV 的C\C接口。我首先假…

第八阶段:uni-app小程序 --首页开发(2)

一&#xff1a;分析页面布局 1.1: 功能 搜索框&#xff1a; 轮播图&#xff1a; 分类的导航区&#xff1a; 楼层区&#xff1a; 二&#xff1a; 利用命令创建home分支 git branch git checkout -b home git branch 三&#xff1a; 配置网络请求(main.js 入口函数&#x…

plt保存PDF矢量文件中嵌入可编辑字体(可illustrator编辑)

背景&#xff1a; 用默认 plt.savefig() 保存图片&#xff0c;图中文字是以瞄点保存&#xff0c;而不是以文字格式。在编辑矢量图中&#xff0c;无法调整文字大小和字体。 方法&#xff1a; import matplotlib.pyplot as plt import numpy as np# ------输出的图片为illustr…

html5使用Websocket

html5使用Websocket 前言1、html5中的websocket2、创建一个 WebSocket 对象3、监听 WebSocket 连接事件4、监听 WebSocket 收到消息事件5、监听 WebSocket 关闭事件6、 监听 WebSocket 出错事件7、发送消息8、整体代码 前言 在即时通讯的交互方式中websocket是一个很使用的方式…

反无人机电子护栏:原理、算法及简单实现

随着无人机技术的快速发展&#xff0c;其在航拍、农业、物流等领域的应用日益广泛。然而&#xff0c;无人机的不规范使用也带来了安全隐患&#xff0c;如侵犯隐私、干扰航空秩序等。为了有效管理无人机&#xff0c;反无人机电子护栏技术应运而生。 目录 一、反无人机电子护栏…

盒子IM开源仿微信聊天程序源码,可以商用

安装教程 1.安装运行环境 安装node:v14.16.0安装jdk:1.8安装maven:3.6.3安装mysql:5.7,密码分别为root/root,运行sql脚本(脚本在im-platfrom的resources/db目录)安装redis:5.0安装minio&#xff0c;命令端口使用9001&#xff0c;并创建一个名为”box-im”的bucket&#xff0c…

CTFHUB-web-信息泄漏

题目所在位置&#xff1a;技能树->web->信息泄漏 目录遍历 打开题目&#xff0c;我们进入的是这个页面 翻译过来就是 得到的信息就是&#xff1a;flag要在这些目录里面寻找&#xff0c;我们直接一个一个点开查看就行 发现得到一个flag.txt&#xff0c;点击打开得到flag …