关于缓存与数据双写一致性问题(清晰易懂)

news2024/9/27 19:24:12

缓存与数据双写一致性问题

一般来说,执行更新操作时,我们会有两种选择:

  • 先操作数据库,再操作缓存
  • 先操作缓存,再操作数据库

两个操作要么同时成功,要么同时失败。所以,这会演变成一个分布式事务的问题。

如果原子性被破坏,会有两种情况:

  • 操作数据库成功,操作缓存失败
  • 操作缓存成功,操作数据库失败

如果第一步已经失败了,我们直接返回Exception出去就好了,第二步根本不会执行。

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

正常情况:

  • 先操作数据库,成功
  • 在操作缓存,成功

如果原子性被破坏了:

  • 第一步操作数据库成功,第二步操作缓存失败,会导致数据库中的数据是最新的,缓存中的数据是旧数据。
  • 如果第一步操作数据库就失败了,可以直接返回错误(Exception),不会出现数据不一致。

删除缓存失败的解决策略:

  • 将要删除的key放到消息队列中
  • 自己去消费,消费失败就重试直至消费成功

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

正常情况:

  • 删除缓存成功
  • 更新数据库成功

如果原子性被破坏:

  • 第一步删除缓存成功,第二步更新数据库失败,这个没有问题,数据库中的数据和缓存中的还是一致的。
  • 第一步删除缓存失败的话,也是一样可以直接返回(Exception)错误,数据库中的数据和缓存中的还是一致的。

意外情况:

A删除缓存

B发现此时缓存没有,从数据库中读进来更新缓存

A更新了数据

此时缓存中的数据就是旧值了。

意外情况的解决策略:

  • 用消息队列,将操作都发送到消息队列中的同一个 partiion 中,保证消费消息的顺序性。
  • 在删除缓存时候,用排它读锁给这条数据锁住,等此线程更新完之后再解锁 (个人见解,因为考虑到意外情况嘛,出现的频率肯定不是很高,在这引入消息队列系统会变得很复杂)

其他保障数据一致的方案与资料

可以用 databus 或者阿里的 canal监听binlog 进行更新。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构设计(五):有状态服务和无状态服务

架构设计(五):有状态服务和无状态服务 作者:Grey 原文地址: 博客园:架构设计(五):有状态服务和无状态服务 CSDN:架构设计(五)&…

批量查询搜狗收录,查询结果不准是什么原因

网站的收录情况是常用的技术手段,会影响到网站的流量和展现量,想要获得一个好的收录就必须重视原创内容,因为网站的收录直接影响力搜索引擎的关键词排名。 网站收录信息如何批量查询? 以搜狗收录为例: 1、打开SEO综合…

17 CPP面向对象编程

简单实用类: 1 类的成员函数可以直接访问该类其它的成员函数 2 类的成员函数可以重载。 3 类指针的用法与结构体指针用法相同 4 类的成员可以是任意数据类型(类中也可以有枚举) 5 可以为类的成员指定缺省值(C11标准&#xff…

Redis基础数据结构源码

1、SDS:动态字符串 src/sds.h:50 struct sdshdr {// 记录buf数组中已使用的字节数,即SDS字符串长度int len;// 记录buf数组中未使用的字节数int free;// 字节数组,用于保存字符串char buf[]; } 杜绝缓冲区溢出。减少修改字符串长度时所需的内…

概率统计·参数估计【区间估计】

置信区间 求解步骤 例 构造一个函数(主要是函数不用依赖未知量只有一个未知量,问μ的置信水平用这个函数,如果σ也未知,就要替换掉这个式子中的σ为S,并且变成服从 t 分布)取上下区间(用2个常数…

邪道方法-字典转字符串以传参字典给多GPU训练的mmseg

文章首发及后续更新:https://mwhls.top/4387.html,无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评,非常感谢! 目录引言 解决方法 引言 我想把字典传参给多GPU训练&#…

CleanMyMac X4.12.2版本功能实用性测评

相信大多数MAC用户都较为了解,Mac虽然有着许多亮点的性能,但是让用户叫苦不迭的还其硬盘空间小的特色,至于很多人因为文件堆积以及软件缓存等,造成系统空间内存不够使用的情况。于是清理工具就成为了大多数MAC用户使用频率较高的实…

他不知道他病了

没时间读书,关注我每天更新一本好书关于作者关于本书核心内容一、如何理解缺乏病识感二、沟通四步策略1.倾听2.同理心3.赞同4.结为伙伴三、如果仍然不接受治疗,怎么办金句关于作者 泽维尔阿玛多是纽约市哥伦比亚大学心理学副教授,全美精神障…

javaSE - StringBuffer 和 StringBuilder(字符串拼接)

前言 StringBuffer 、 StringBuilder、 String 是三种数据类型 首先来回顾下String类的特点: 任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。通常来讲String的…

Oracle-expdp导出时间变长问题分析

前言: 近期处理了一起expdp导出时间变长的问题,在数据量没有较大增长的情况下,expdp导出时间发生倍数增长,后面分析发现是由于Bug 27634991导致在AMM,ASMM模式下,由于streams pool内存抖动触发了内存收缩,内存收缩的过…

jsp+ssm计算机毕业设计窗户管理系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

[附源码]Nodejs计算机毕业设计基于社区人员管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

【图像去噪】DCT图像去噪【含GUI Matlab源码 614期】

⛄一、图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素,图像去噪是指减少图像中噪声的过程。噪声分类有三种:加性噪声,乘性噪声和量化噪声。我们用f(x,y)表示图像,g(x,y&#xff0…

基于java+springmvc+mybatis+vue+mysql的戒烟网站

项目介绍 大量研究证据表明,戒烟可降低或消除吸烟导致的健康危害。任何人在任何年龄戒烟均可获益,且戒烟越早、持续时间越长,健康获益就越大。随着时代发展人们对健康也越来越重视,更多的人参与到了戒烟的行列中来,本…

[go]分布式系统之snowflake与锁

文章目录分布式id生成器分布式锁负载均衡go语言在网络服务模块有着得天独厚的优势; https://www.cnblogs.com/thepoy/p/14573822.html中详细介绍了涉及到的分布式相关技术。分布式id生成器 Snowflake(雪花算法),由Twitter提出并开…

六问 Kafka 为啥那么牛

1 Kafka 简介 1.1 Kafka 概述 Kafka 是一个分布式的基于发布/订阅模式的消息队列,依靠其强悍的吞吐量,Kafka 主要应用于大数据实时处理领域。在数据采集、传输、存储的过程中发挥着举足轻重的作用。 Apache Kafka 由 Scala 写成,是由Apache软…

转行IT行业学什么比较好?月薪过万要多久?

学什么,比穿什么衣服的问题更难,因为职业的背后,更多的是抉择而不是选择,选错一件衣服可以重来,而选错一个职业所面对的结果,是非常让人痛苦的。 本文是小编对想转行IT行业的你最真挚的建议。 任何事情&a…

QT5.14.2搭建Android开发环境

项目需求:因项目需求需要使用QT开发功能类似的一个跨平台项目,基于Android系统上运行单机软件。 开发环境:Windows 10 QT5.14.2 搭建步骤: 1、安装Java软件,配置环境变量 java软件安装可以选择默认安装位置,我下载…

KNN学习

学习B站 【什么是KNN(K近邻算法)?【知多少】】 https://www.bilibili.com/video/BV1Ma411F7Y4/?share_sourcecopy_web&vd_sourced928ac2eb2c6b562d9488d15f78dfbf4 什么是KNN NN neural network 并不是 KNN 是k-Nearest Neighbors K 近…

[附源码]Node.js计算机毕业设计孤儿院救助平台Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…