redis缓存和数据库通过延迟双删除实现数据一致性

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

目录

前言

先删缓存,再更新数据

先修改数据,再更新缓存

双删除

延迟双删除

延迟双删除的策略:

异步线程

延迟mq


前言

为了提高查询的效率,我们经常会用到redis缓存,但是使用redis缓存就不可避免缓存一致性的问题。

先删缓存,再更新数据

如果并发查询可能会再删除缓存后,还没有更新数据库的时候,第二个线程读取到旧数据,并将旧数据写入缓存,导致数据不一致。

先修改数据,再更新缓存

问题1:如果先修改数据,再更新缓存,如果此时有并发查询,则第二个线程在修改数据和更新缓存之间查询的时候,查询到的数据是旧数据,导致数据不一致。

问题2:如果先修改数据,再更新缓存,如果此时修改数据成功,但是更新缓存失败,则会导致后面查询到的数据是旧数据,导致数据不一致。

双删除

先删除缓存再更新数据再删除缓存

此时可以解决先修改数据,再更新缓存多线程读取到旧数据的问题,但还不能完全解决缓存一致性问题。

并发情况下如果第二个线程查询到旧数据后,在第一个线程第二次删除缓存后再更新缓存,则会导致后面查询到的数据是旧数据,导致数据不一致。

所以此时需要引入延迟双删除。

延迟双删除

延迟双删除要求延迟删除的时间要大于一次查询和更新缓存的时间。原因:如果延迟时间小于这的时间,会导致第一次请求清除了缓存,之后第二次请求将查询到的旧数据写入缓存,造成数据不一致。

延迟双删除的策略:

异步线程

如果是单机系统可以考虑使用异步线程,延迟几百毫秒到2秒之间(根据自己接口的耗时判断),此种策略只适用于请求量不大的情况下,如果服务器重启,则延迟删除的任务会丢失,不推荐。

延迟mq

发送删除redis的延迟mq,如果删除失败还可以重试。适合分布式架构,并发多的业务。

延迟双删除也不能避免数据不一致,所以redis的缓存时间也不要太久,便于及时更新缓存信息。

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

相关推荐

【JAVA面试】Redis和Mysql如何保证数据一致

提示:文章先作为初版,等后续时间充足后,补充更深的内容。

Gangangan_的博客 1325

Redis缓存数据和表数据一致性之延迟双删策略

延迟1是为了等待更新数据表动作完成、2是为了等待更新数据表之前查询查到的旧数据写入缓存动作完成,最后再把写入缓存的旧数据删除。当请求1执行删除缓存数据后,还未来得及更新数据表或更新动作还未完成,此时请求2查询到数据表中仍然是更新之前的数据、并把脏数据写入了Redis缓存。当请求1执行update更新数据表后,还未来得及删除缓存数据或删除缓存动作还未完成,此时请求2查询到Redis缓存中仍然是旧数据、并返回给前端。3、Redis适用的是读频率远远大于改频率的数据表,不适合改频率大于读频率的数据。

hkl_Forever的博客 4750

怎么保证 Redis 和 DB 中的数据一致?

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

数字成都 7683

【Redis】所以延迟双删有啥用

延迟双删(Delay Double Delete)是一种在数据更新或删除时为了保证数据一致性而采取的策略。这种策略通常用于解决数据在缓存和数据库中不一致的问题。 具体来说,在某些场景下,我们需要先更新或删除数据库中的数据,然后再更新或删除缓存中的数据,以保证数据的一致性。但在某些情况下,由于网络延迟、服务器故障或其他原因,可能导致缓存中的数据更新或删除失败,从而导致数据库和缓存中的数据不一致。

陈宝子的博客 2万+

基于QT的华为网络摄像头二次开发

第一次使用华为的网络摄像头并进行二次开发,网上关于QT对华为网络摄像头的二次开发的文章很少,基于项目的需求做了一些工作,特此记录。 目标: 1、实时预览 2、手动控制录制视频 3、监听告警型号 4、实时获取元数据中的划定区域内的人数 摄像头型号如下: 准备工作: 在购买摄像头后,应当在官网下载对应的开发资料,如果需要权限,则联系华为的技术支持人员。下载资料如下: SDC Development Kit Demo 8.0.T9 SDK DEMO下载地址:https://bbs.hua

xumingyifrend的博客 3168

基因ID转换避坑指南:如何用org.Hs.eg.db把ENSEMBL ID变成可读的gene symbol

本文详细介绍了如何将RNA-seq等数据中常见的ENSEMBL ID转换为可读的基因符号(Gene Symbol),重点对比了biomaRt与org.Hs.eg.db两大工具的优劣,并深入剖析了多对多映射、版本号失效及非编码基因Symbol缺失三大核心陷阱。文章提供了针对TCGA、GEO等不同数据源的定制化处理方案与完整的稳健转换流程,帮助生物信息学分析者避免常见错误,确保下游分析的准确性。

weixin_28223453的博客 700

使用Redis如何保证数据的一致性

业务系统通常使用数据库(如MySQL)来存储持久化数据,并使用缓存(如Redis)来提升系统的性能。同时使用数据库和缓存,有一个老生常谈的问题,就是缓存与数据库一致性的问题。

2201_75639894的博客 1964

使用Microsoft Print to PDF进行编程:创建PDF文件的简单方法

Microsoft Print to PDF是一种内置于Windows操作系统中的功能,它允许我们通过打印操作将任何可打印的内容保存为PDF文件。然后,我们使用Microsoft Print to PDF打印机进行打印操作,并将输出文件保存为指定的PDF文件。使用Microsoft Print to PDF功能是一种方便且简单的方法来创建PDF文件,无论是在个人使用还是在企业开发中,它都可以提供良好的支持和灵活性。请注意,如果你使用的是其他编程语言,你可以根据相应的打印机接口或库来实现类似的功能。

TechSavant的博客 1634

延时双删策略, 解决redis、mysql数据一致性问题

延时双删策略在一定程度上可以缓解Redis和MySQL之间的数据一致性问题,但并不能完全解决所有问题。它适用于对最终一致性要求较高但能容忍一定延迟的场景。在实际应用中,应该根据具体的业务需求选择合适的策略,可能还需要结合其他技术手段来确保数据的一致性。旁路缓存模式在读取数据时首先查询缓存,如果缓存未命中则查询数据库,并将结果写入缓存。在更新数据时,先更新数据库,再删除或更新缓存从缓存中读取数据。如果缓存未命中,从数据库读取数据并写入缓存更新数据库。删除缓存。简单易实现。

weixin_43948208的博客 1753

【图像去噪】论文复现:超分思想助力荧光显微图像自监督去噪!N2SR的Pytorch源码复现,图文详细教程跑通源码,框架结构原理示意图与代码对应,注释详细,补充三个实用功能代码!

论文题目:Noise2SR: Learning to Denoise from Super-Resolved Single Noisy Fluorescence Image —— Noise2SR:从超分辨率单噪声荧光图像中学习去噪【图像去噪】论文精读:Noise2SR: Learning to Denoise from Super-Resolved Single Noisy Fluorescence Image(N2SR)N2SR框架结构和原理都比较简单,创新点是加入超分,有很多类似的自监督框架;

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 631

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3655

Redis保证数据一致性-延时双删代码实现

Redis和数据库的数据一致性在某些场景下非常重要,如何最大程度保证Reids和数据库之间的数据一致呢?想必大家第一时间会想到延时双删策略:在修改数据库之前删除缓存,然后数据库中的数据修改完成后,再过一段时间再删一次缓存。这篇文章就如何实现延时双删提供了案例代码,代码可能不是最优的,但是确实能够达到双删的效果。

沐雨橙风ιε的博客 2485

【汽车 OTA 】差分升级

汽车 OTA 差分升级,本质是在整包 OTA 的基础上,通过“只传变化”的方式,大幅减少下载数据量、时间和成本,是当前车端软件升级的主流方向之一。

天赐好车的博客 480

【4种方案】如何保证Redis与数据库的数据一致!

【4种方案】如何保证Redis与数据库的数据一致?

Tmoon的博客 1万+

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

7.29华为OD机试真题 新系统 - 能量对撞 (Java/Py/C/C++/Js/Go)

算法大师! 1315

【调优】OpenClaw从零开始高阶调优之skill篇

本文详细解析了OpenClaw技能系统的核心机制。首先介绍了技能的分层加载逻辑,按照优先级从高到低依次为:工作区专属技能、全局共享技能、出厂自带技能和自定义路径技能。通过流程图展示了从扫描到注册的完整加载流程,并解释了同名技能覆盖规则。随后深入剖析了SKILL.md文件结构,包含YAML元数据定义技能属性和Markdown正文说明使用方法,以公众号写作技能为例展示了具体配置。文章还提供了技能优先级切换的实用技巧,帮助用户灵活管理不同版本的技能。

海兰 238

redis数据一致性串行化方案_如何保障mysql和redis之间的数据一致性?

在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问Mysql等数据库。这样可以大大缓解数据库的压力。Redis缓存数据的加载可以分为懒加载和主动加载两种模式,下面分别介绍在这两种模式下的数据一致性如何处理。懒加载读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存和...

weixin_36269733的博客 310

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

redis缓存一致性延时双删代码实现方式详解

高并发场景使用redis作为缓存存储数据,当数据更新时,如何保证缓存一致性,先删除缓存,然后更新数据库数据,休眠sleep,最后再次删除缓存数据。//声明一个用于延时的定时线程池代替线程sleep。//执行清除缓存的动作。当读写分离时,考虑到主从数据同步延迟,休眠时间约1s。休眠的时间略微大于从数据库查询数据的时间。休眠时间不能太大,否则会影响更新的速度。//如果清除注解开启了。

Free雅轩的博客 2588

VB摄像头监控

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

缓存双写一致性

多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它。其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。(下面代码示例图是我在做短链接项目时使用到的双检加锁策略,防止缓存击穿)

LYT0905的博客 2086

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

如何保证Mysql和Redis数据一致性

数据一致性没有绝对的保证,要么牺牲性能加锁,要么串行。在高并发下,这些方案都只能做到优化。

weixin_43889788的博客 742

mysql和redis删除数据_如何保持mysql和redis中数据的一致性?

在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问Mysql等数据库。这样可以大大缓解数据库的压力。具体业务流程如下:读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存和数据库间的数据一致性问题。不管是先写数据库,再删除缓存;还是先删除缓存,再写库,都有可能出现数...

weixin_36335279的博客 599

Redis双写一致性:原理与最佳实践

在分布式系统中,数据的一致性是保证系统稳定性和可靠性的关键。以Redis为例,作为一款高性能的键值存储系统,其数据的一致性尤为重要。在实际应用中,我们常常会遇到这样一个问题:当Redis进行写操作时,如何确保数据的一致性,避免出现数据丢失或错误的情况?为了解决这个问题,我们需要了解Redis中的双写一致性机制。所谓双写一致性,是指在Redis进行写操作时,同时将数据写入内存和磁盘,确保数据在内存和磁盘上的一致性。这种机制可以有效避免因系统故障导致的数据丢失问题。

JavaCodePro的博客 716

redis缓存双写一致性

redis缓存双写一致性策略

阿佐的博客 173

【Redis与数据库的数据一致性】

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

D1561691的博客 459
上一篇: python使用selenium,实现简单爬虫功能
下一篇: mybatisplus使用OptimisticLockerInnerInterceptor实现版本号乐观锁
bxp1321
博客等级 码龄17年 146粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值