Redis和MySQL数据一致性方案

MySQL与Redis数据一致性的6种解决方案 通过以上补充和优化,我们提供了更全面的MySQL与Redis数据一致性解决方案。根据具体的业务需求和系统环境,选择合适的方案可以提高数据一致性的可靠性。然而,每种方案都有其优缺点和适用场景,需要综合考虑权衡。 阅读详情

一、需求起因

高并发业务场景,数据库通常都是用户并发访问最薄弱的环节。所以,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问MySQL等数据库。

从 Redis 读数据,一般都是按照下图的流程来进行业务操作:

读取缓存一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。不管是先写数据库,再删除缓存;还是先删除缓存,再写数据库,都有可能出现数据不一致的情况。比如:

  1. 如果删除了缓存,还没有来得及写库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。
  2. 如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

因为写和读是并发的,无法保证顺序,就会出现缓存和数据库的数据不一致的问题。如何解决?

二、缓存和数据库一致性解决方案

1️⃣采用延时双删策略

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

//具体的步骤:先删除缓存;再写数据库;休眠500毫秒;再次删除缓存。
public void write(String key,Object data){
   redis.delKey(key);
   db.updateData(data);
//不休眠的话,读请求还有可能未结束,造成脏数据
   Thread.sleep(500);
   redis.delKey(key);
}

这个500毫秒怎么确定的,具体该休眠多久呢?
需要评估具体项目的读数据业务逻辑的耗时。目的就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。

当然这种策略还要考虑 Redis 和数据库主从同步的耗时。最后的写数据的休眠时间:在读数据业务逻辑的耗时基础上,加几百毫秒即可。比如:休眠 1 秒。

设置缓存过期时间
从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

该方案的弊端
结合双删策略+缓存超时设置,这样最差的情况就是在超时时间内数据存在不一致,而且又增加了写请求的耗时。

2️⃣异步更新缓存(基于订阅binlog的同步机制)

技术整体思路:
MySQL binlog 增量订阅消费+消息队列+增量数据更新到 Redis

读 Redis:热点数据基本都在 Redis
写 MySQL:增删改都是操作 MySQL
更新 Redis 数据:MySQL 的数据操作 binlog,来更新到 Redis

Redis更新:

  1. 数据操作主要分为两大块:
    一个是全量(将全部数据一次写入到 Redis)、一个是增量(实时更新)。这里说的增量,指的是 MySQL 的 update、insert、delate 变更数据。

  2. 读取 binlog 后分析,利用消息队列,推送更新各台的 Redis 缓存数据。这样一旦 MySQL 中产生了写入、更新、删除等操作,就可以把 binlog 相关的消息推送至 Redis,Redis 再根据 binlog 中的记录,对 Redis 进行更新。其实这种机制,很类似 MySQL 的主从备份机制,因为 MySQL 的主备也是通过 binlog 来实现的数据一致性。
    这里可以结合使用 canal(阿里的一款开源框架),通过该框架可以对 MySQL 的 binlog 进行订阅,而 canal 正是模仿了 MySQL 的 slave 数据库的备份请求,使得 Redis 的数据更新达到了相同的效果。
    当然,这里的消息推送工具也可以采用别的第三方:kafka、RabbitMQ等来实现推送更新 Redis。

如何保障 MySQL 和 Redis 的数据一致性? 对于这种方案,看看就行,反正我是不会用,太Low了,风险也不可控。 阅读详情

相关推荐

架构师-如何保证redis和数据库的一致性

在分布式系统中,保证Redis和MySQL之间的数据一致性是一个复杂且重要的问题。由于Redis是内存数据库,而MySQL是磁盘数据库,它们的特性和持久化方式不同,因此需要特殊的注意和处理来确保数据的一致性。双写模式:在进行写操作时,先将数据写入MySQL,然后再将数据写入Redis。这种方式可以保证MySQL中的数据一定会被同步到Redis中,但是对于读操作来说效率较低。异步更新:在进行写操作时,只将数据写入MySQL,然后异步地将数据写入Redis。

技术博客 2956

4 种数据库缓存最终一致性的优缺点对比?最终选择方案四!

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 4 分钟。来自:叶不闻 jjuejin.im/post/5d5c99b66fb9a06ae072060d背景缓存是软...

良月柒 1207

高并发架构系列:Redis缓存和MySQL数据一致性方案详解

一、需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。 这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。 读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)...

mikechen的互联网架构 1万+

MySQL和Redis保持数据一致性的解决方案总结

MySQL与Redis数据一致性解决方案总结,MySQL学习总结

q160336802的博客 5130

【Tableau】解决订阅报表PDF中文显示为乱码(方框)问题

一、问题描述 在tableau server网页端报表中文字符能正常显示,但在订阅后发送到邮箱时,以图片格式呈现的内容中中文字符显示为方框。 网页端报表能正常显示中文字符: 邮件中的报表不能正常显示中文字符: 二、问题分析 网页端字符显示情况是由html编码决定的,而tableau生成图片时是通过所部署的服务器的字体文件显示字体。因此可能是由于Linux服务器缺失相关的字体文件导致网页端选择的中文字体在服务器上缺失对应的字体文件导致的。则考虑在服务器引入对应的字体文件。 三、问题解决 1、查看服务器现有

why_not_study的博客 2833

lift off工艺为什么常用蒸发的方式镀膜?

电子束蒸发中,蒸发物质从源头直接升华并沿直线路径沉积到晶圆上,它可以避免金属在掩模侧壁的覆盖,只在表面进行沉积。在镀膜结束后,在进行光刻胶剥离时,去胶液无法与光刻胶接触反应,导致光刻胶剥离很困难。欢迎加入我的半导体制造知识星球社区,目前社区有1900人左右。我观察到晶圆厂中lift off工艺,镀膜都是用的电子束蒸发的方式,很少有用磁控溅射的方式,为什么?需要增加撕胶工序,将胶面上覆盖的膜层撕掉,使光刻胶露出,这样才容易剥离。上图为磁控溅射的膜层截面图,去胶液很难突破侧壁膜层,进行反应。

1685

redis和mysql数据一致性方案

场景:先删除Redis,再更新 MySQL,不主动更新Redis,访问redis 没有数据,再访问MySQL 把数据回写到Redis。在高并发情况下,如果请求 A 在更新MySQL 时卡了一会,请求 B 已经依次完成数据的更新,就会出现图中的问题。在高并发情况下,如果请求 A 在写 Redis 时卡了一会,请求 B 已经依次完成数据的更新,就会出现图中的问题。对于上面这种情况,对于第一次查询,请求 B 查询的数据是 10,但是 MySQL 的数据是 11,对数据一致性比较敏感的服务可以采用这个方案。

qq_35640866的博客 721

头歌平台 操作系统课堂练习2.3:系统调用

使用 gdb 调试内核,跟踪到 main 函数入口的方法与之前实训一样。系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?本关卡使用版本 1 内核进行分析,版本 1 内核文件存放在。为了完成本关任务,你需要:跟踪系统调用的发生。此时,系统调用号存放在寄存器 eax 中。

lazbuyaotoutu的博客 2万+

MySQL 和 Redis 数据一致性解决方案

MySQL 和 Redis 作为两种不同类型的数据库(关系型 vs 内存型),在配合使用时需要特别注意数据一致性问题。以下是几种常见的解决方案:

Aaron Fang的专栏 728

ENVI-met新手必看:从零开始创建城市微气候模型(附详细步骤+底图制作技巧)

本文为ENVI-met新手提供从零开始创建城市微气候模型的详细指南,包括环境准备、参数配置、底图制作技巧和三维模型构建步骤。特别针对常见问题提供解决方案,帮助初学者快速掌握城市微气候模拟技术,提升建模效率。

weixin_29269441的博客 407

SLAM Cartographer(18)后端优化问题求解器

了解经过闭环检测构建了子图与节点之间的约束之后,通过后端优化求解器进行优化求解。核心是基于Ceres库进行SPA(Sparse Pose Adjustment)的优化方法,把后端优化问题描述成为一个最小二乘的问题求解

氢键H-H 5680

Redis缓存和MySQL数据一致性方案详解

Redis缓存和MySQL数据一致性方案详解

我要修改昵称 363

多摄像头场景下 ISP 的同步与调度机制实战解析

在智能手机多摄系统中,主摄、广角、长焦、微距等摄像头的协同工作能力直接决定了影像系统的体验上限。而支撑这一能力的核心之一,正是 ISP 的同步与调度机制。ISP 需要处理多个 Sensor 的输入流、统一时序、资源仲裁、并发调度,并支持在不同模式间快速切换(如预览 → 拍照 → 视频)。本文将基于 Qualcomm、MTK、HiSilicon 平台的实际架构,系统性剖析 ISP 在多摄场景下的时序控制、Pipeline 配置、Buffer 管理与故障恢复机制,并分享实战中的典型问题与调试方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2347

实现MySQL和Redis数据一致性的方案

实现MySQL和Redis缓存一致的方案延时双删策略操作步骤示例代码异步更新缓存(基于订阅binlog的同步机制)操作步骤示例代码 延时双删策略 操作步骤 示例代码 异步更新缓存(基于订阅binlog的同步机制) 操作步骤 示例代码 ...

kucfire 4148

基于注意力机制的行人重识别(Reld)模型论文解读----Relation-Aware Global Attention for Person Re-identification

任务概述:在多摄像头的复杂场景中,快速定位查找指定目标的所有结果。

qq_52053775的博客 1895

YOLOv13涨点改进 | 独家创新、Neck特征融合改进篇 | TGRS 2024 | 引入 EFC增强跨层特征相关创新点,含MSEF(多尺度有效融合模块)二次创新模块,助力遥感目标检测涨点

本文提出EFC(增强跨层特征相关)模块改进YOLOv13模型,显著提升小目标检测性能。EFC通过分组特征聚焦(GFF)和多层特征重建(MFR)增强特征融合效率,在小目标检测任务中平均精度(mAP)提升1.7%,同时减少模型计算量。实验验证EFC在VisDrone等数据集上的有效性,改进后的模型能更好地保留小目标细节信息。还提出二次创新模块MSEF,集成通道和位置注意力机制,进一步优化特征表达。文章详细介绍了模块配置方法和yaml文件修改步骤,为小目标检测任务提供了实用的改进方案。

Ai缝合怪、助力小伙伴高效发论文 325

如何保证redis和mysql数据一致性方案对比

业务 耦合 强,每个更新都要写双删 弱,业务只管 DB。DB update → MySQL binlog → Canal → 消费端处理 → 更新缓存 / 下游系统。Canal + Binlog 更新缓存适合大型、分布式、高并发场景,因为它解耦、统一、可重试,维护成本更低。原因:事务A更新缓存成功,更新数据库失败,就会导致redis和mysql的。// Redis / 本地缓存。先更新缓存再更新数据库的做法,永远无法保证数据严格的一致性。

qq_41181702的博客 800

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

分布式缓存redis 方案_Redis缓存和MySQL数据一致性方案详解

在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到Redis,而不是直接访问MySQL等数据库。这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。不...

weixin_39999730的博客 130

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

mysql试卷缓存_Redis缓存和MySQL数据一致性方案详解

关注我,可以获取最新知识、经典面试题以及技术分享一、需求起因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓...

weixin_31629313的博客 133

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java技术--高并发Redis缓存和MySQL数据一致性方案

1.缓存(Redis)和数据库(MySQL)间的数据一致性问题 (1)读取缓存一般没有什么问题,但是一旦涉及到数据更新 (2)数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题 (3)不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况 (4)示例如下: <1>如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据 &

qq591009234的博客 1350

java redis 缓存方案,Java架构师-Redis缓存和MySQL数据一致性方案详解

群529722406.png一、需求起因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。群529722406.png这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。群529722406读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数...

weixin_35082950的博客 185
上一篇: SpringBoot缓存注解@Cacheable、@CacheEvict和@CachePut
下一篇: 算法的时间复杂度和空间复杂度
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值