Redis数据库双写一致性解决方案


程序员的公众号:源1024,获取更多资料,无加密无套路!

最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等
获取方式: 关注公众号并回复 666 领取,更多内容持续奉上


缓存可以提升性能,减轻数据库压力,同时,也存在一些新的问题,如缓存和数据库之间的数据一致性问题。

  1. 先更新缓存,再更新数据库

    问题:如果缓存更新成功,数据库更新失败,导致数据不一致

  2. 先更新数据库,再更新缓存

    问题:如果数据库更新成功,更新缓存失败,导致数据不一致

  3. 先删除缓存,再更新数据库

    问题:如果删除缓存成功,更新数据库失败,此时新的请求读取到数据库中的旧数据更新到缓存中,这样好像数据库与缓存中的数据是一致的。但是如果在高并发环境下,极端情况还是会导致数据不一致问题的(比如同时进来的两个请求,一个写请求,一个读请求,写请求删除缓存,并且成功更新主库的数据,但还没同步给从库,读请求就判断缓存为空,去从库里读取数据,拿到旧数据后写入缓存,随后写请求将新数据同步给从库,就导致了缓存和数据库不一致问题)

  4. 先更新数据库,再删除缓存

    问题:更新数据库成功,删除缓存失败,导致数据不一致

解决方案

  • 延迟双删

延迟双删策略是分布式系统中数据库存储和缓存数据保持一致性的常用策略,但它不是强一致的。

实现:先删除缓存然后更新数据,在最后延迟 N 秒再去执行一次缓存删除(这里设置的N秒主要是保证读请求结束,写请求可以删除读请求造成的缓存脏数据,N需要根据实际情况评估);如果第二次缓存删除失败,可以考虑将需要删除的key发送给消息队列,通过消费重试,直到删除成功。

  • ​MQ重试删除

更新完数据库之后进行删除,如果删除失败则向MQ发送一条消息,然后消费者不断进行删除尝试。

  • binlog异步删除

实现:低耦合的解决方案是使用canal。更新数据库,会把操作信息记录在binlog日志中,canal监听主机mysql的二进制文件,当数据发生变化时发送给MQ,最终消费进行删除。

 系列文章索引

MyBatis的插件能在哪些地方进行拦截?

了解MyBatis的缓存机制吗

面试官:谈谈对volatile的理解

Spring中用到了哪些设计模式

面试官:说一下SQL的执行过程

线程池的工作原理

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

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

相关文章

解决requests 2.28.x版本SSL错误:证书验证失败

1、问题背景 在使用requests 2.28.1版本时,我进行HTTP post传输报告负载时,由于SSL验证设置为True,请求失败,错误如下:(Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certifi…

ROC 曲线:健康背景下的应用和解释

一、介绍 在医疗保健领域,做出明智的决策对于改善患者治疗结果、有效分配资源和设计有效的诊断测试至关重要。受试者工作特征 (ROC) 曲线是一个强大的工具,在评估诊断测试的性能、区分健康个体和患病个体以及优化医疗保健干预方面发挥着至关重要的作用。…

[C++历练之路]vector的介绍以及底层模拟实现

W...Y的主页 😊 代码仓库分享 💕 🍔前言: 我们学习了STL中的string以及其所有重要接口并进行了模拟实现,但是STL中包含的内容不止于此。学习了string之后继续学习STL中的vector,学习成本会大大降低&#…

LLM大模型 (chatgpt) 在搜索和推荐上的应用

目录 1 大模型在搜索的应用1.1 召回1.1.1 倒排索引1.1.2 倒排索引存在的问题1.1.3 大模型在搜索召回的应用 (实体倒排索引) 1.2 排序1.2.1 大模型在搜索排序应用(融入LLM实体排序) 2 大模型在推荐的应用2.1 学术界关于大模型在推荐的研究2.2 …

什么是Selenium?如何使用Selenium进行自动化测试?

什么是 Selenium? Selenium 是一种开源工具,用于在 Web 浏览器上执行自动化测试(使用任何 Web 浏览器进行 Web 应用程序测试)。   等等,先别激动,让我再次重申一下,Selenium 仅可以测试Web应用…

协同办公是什么?如何高效协同办公?读这篇就够了!

协同办公是指在工作中,团队成员通过共享信息、协作完成任务,实现高效的工作方式。它有助于促进团队成员之间的沟通、合作和协调,提升工作效率和质量。以下是一些实现高效协同办公的建议和好用的工具推荐。 首先,建立清晰的沟通渠…

二十一、数组(1)

本章概要 数组特性 用于显示数组的实用程序 一等对象返回数组 简单来看,数组需要你去创建和初始化,你可以通过下标对数组元素进行访问,数组的大小不会改变。大多数时候你只需要知道这些,但有时候你必须在数组上进行更复杂的操作…

duplicate复制数据库单个数据文件复制失败报错rman-03009 ora-03113

duplicate复制数据库单个数据文件复制失败报错rman-03009 ora-03113 搭建dg过程中,发现有一个数据文件在复制过程中没有复制过来,在备库数据文件目录找不到这个数据文件 处理方法: 第一步:主库备份86#数据文件 C:\Users\Admi…

遇见未来的你——过程中真是苦了你妈妈

目录 一、背景介绍二、思路&方案三、过程1.你给你妈妈增加的体重负担2.你给你妈妈增加的起夜负担3.凌晨6点你非常活跃吓坏爹妈4.凌晨3点你又调皮的让我和妈妈用仪器与你互动5.经历,都在积攒未来相遇的泪湿眼眶 四、总结 一、背景介绍 十年前,你米爷…

【Linux】U盘安装的cfg引导文件配置

isolinux.cfg文件 default vesamenu.c32 timeout 600display boot.msg# Clear the screen when exiting the menu, instead of leaving the menu displayed. # For vesamenu, this means the graphical background is still displayed without # the menu itself for as long …

串口通信

1.1 串口简介 在串口中 用0和1表示高低电平 VCC供电 设备A给设备B供电 如果各自都有供电的模块就不需要连接这个线 GND的连线是为了获取相同的电压基准 因为有时候获得电压各自判断的标准不一样 可能获得不一样的电压 如果想A发送数据给B那么蓝线不需要连接 如果想B发送给A那么…

Springboot升级为3.0.6

版本升级 Springboot升级为3.0.6 版本从原来的2.7.12换成了3.0.6 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.6</version><relativePath/> <…