探讨缓存一致性问题

news2024/11/15 4:15:35

探讨缓存一致性问题

本文只探讨只读缓存,即只对缓存进行读取、写入、删除,不进行更新操作

前言

数据库的读写性能上限是比较低的,工程中经常在数据库前面加一层缓存,可能是Redis或者本地缓存。既然有缓存,那么不可避免的会遇到缓存一致性问题。

缓存一致性的概念

缓存一致是指:缓存有值,且值等于数据库中的值,如果缓存中的值不等于数据库中的值,则认为是不一致。

缓存的操作场景

一般操作缓存有两种场景:新增和更新(修改、删除)。

新增

操作流程:

  1. 向数据库写入新的数据
  2. 读取时,缓存中不存在,则进行回源并更新缓存,这时数据库和缓存是一致的
    在这里插入图片描述

更新

更新缓存的场景内其实还有两个细分场景,主要差别是更新的顺序不同。如下:

  1. 先更新数据库,后删缓存
  2. 先删缓存,后更新数据库
    在这里插入图片描述

问题以及解决方案

新增场景下不会有不一致的问题,因为读取是从数据库读取并写入到缓存中的,所以始终是一致的。
更新场景下会遇到两个问题:

  1. 单线程下的操作失败问题
  2. 并发情况下的顺序问题

单线程情况

因为更新是有两个操作步骤,即更新数据库和删除缓存,如果后续步骤失败了,那就会才造成数据不一致,例如先更新数据库但是删除缓存失败了,那么后续的请求会直接读取到缓存中的旧值;反而如果是先删除缓存,但是后续更新数据库失败了,影响倒是不大,后续的请求发现缓存不存在,会回源正确的数据。
在这里插入图片描述

解决方案

消息队列+重试

将更新操作生成消息,暂存在消息队列中,当删除缓存成功后,将消息从消息队列中丢弃,当删除失败时,执行失败策略,从消息队列中取出消息进行重试,重试超过一定次数则上报。
在这里插入图片描述

订阅binlog变更日志

创建一个更新服务订阅数据的binlog变更日志,收到数据库变更后删除缓存

并发情况

并发情况下需要对两个更新顺序分别分析

先删除缓存 后更新数据库

线程A删除缓存后,线程B进行读取,发现数据不存在,则进行回源,此时缓存值是旧的,最后线程A才将更新的新值写入数据库。
在这里插入图片描述

解决方案
  1. 设置缓存过期时间+延时删除
    设置缓存过期时间,这样数据过期后还可以再次拉取数据库进行更新,达到最终一致性。即使数据不一致,但造成的影响时间范围比较小,。或者使用延时队列在更新完数据库后再次进行删除缓存,这样即使在延时期间有其他线程读取了旧数据并更新缓存,后续也一定会再次进行更新。

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

线程A更新数据库后,还没删除缓存,这时线程B进行读取,读取到了缓存中的旧值。
简单并发问题
或者如果数据库采用主从架构时,线程A更新完数据库并删除缓存后,线程B发现缓存无数据进而向从数据库拉取数据并写缓存,如果这时主数据库的数据还未同步到从数据库时,就会导致数据不一致。
主从同步问题

解决方案
  1. 延时删除
    更新完数据库后延时一段时间再进行删除,避免主从数据库同步延迟造成的数据不一致
  2. 订阅数据库binlog进行删除
    可以订阅数据库的binlog,等从数据库全部同步完成后再删除缓存
  3. 加锁
    更新数据库+删除缓存合并成一个原子操作,进行加锁处理,线程A进行更新时,加锁,线程B判断有锁后,直接读取数据库数据进行返回,不再进行写缓存操作
    在这里插入图片描述

总结

请添加图片描述

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

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

相关文章

归并交换基数简单选择排序

文章目录 1 交换排序1.1 冒泡排序1.1.1 冒泡排序算法1.1.2 性能分析 1.2 快速排序1.2.1 快排的算法1.2.2 性能分析1.2.3 快排的特点 2 简单选择排序2.1 简单排序算法2.1.1 性能分析 2.2 堆排序2.2.1 堆的调整2.2.2 筛选过程算法2.2.3 堆的建立算法2.2.4 性能分析 3 归并排序3.1…

CertGetCertificateChain trust error CERT_TRUST_REVOCATION_STATUS_UNKNOWN

执行命令: curl --cacert http_ca.crt -u elastic https://localhost:9200 结果报错了 直接访问https://localhost:9200/ ,正常 解决办法: curl --cacert http_ca.crt -u elastic https://localhost:9200 --insecure

微信小程序:实现提示窗确定,取消执行不同操作(消息提示确认取消)showModal

效果 代码 wx.showModal({title: 提示,content: 是否确认退出,success: function (res) {if (res.confirm) {console.log(用户点击确定)} else if (res.cancel) {console.log(用户点击取消)}}})

linux 故障定位

linux 故障定位 1. cpu1.1 说明1.2 分析工具1.3 使用方式 2. 内存2.1 说明2.2 分析工具2.3 使用方式 3. I/O3.1 说明3.2 分析工具3.3 使用方式 4. 网络4.1 说明4.2 分析工具4.3 使用方式 5. 系统负载5.1 说明5.2 分析工具5.3 使用方式 6. 火焰图6.1 说明6.2 安装依赖库6.3 安装…

应用程序流量警报软件

为了避免因使用资源密集型应用程序(如基于云的应用程序)而出现的潜在中断和延迟问题,企业需要监控应用程序流量并尽快找到网络事件的根本原因。业务的应用程序流量监视是了解业务关键型应用程序何时具有高时间可用性以及何时存在利用率超过基…

网上订货系统源码 购买后交付一些什么内容

随着电子商务的快速发展,越来越多的企业开始意识到建立一个高效的网上订货系统的重要性。网上订货系统不仅可以提高企业的销售效率,还可以降低成本,提升客户满意度。然而,要建立一个完善的网上订货系统并不容易,需要考…

SpringMVC 拦截器详解

目录 一、介绍 二、过滤器与拦截器的简单对比 三、自定义拦截器 四、注册拦截器 五、案例演示-登录拦截器 5.1 自定义拦截器 5.2 注册拦截器 编写的初衷是为了自己巩固复习,如果能帮到你将是我的荣幸❣️ 一、介绍 SpringMVC提供的拦截器类似于JavaWeb中的过…

火山引擎VeDI最新分享:消费行业的数据飞轮从“四更”开始

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 数据飞轮,正在为消费行业的数字化升级提供一套全新模式。 在刚刚结束的《全链路增长:数据飞轮转动消费新生力》专场活动上,火山引…

事务隔离:为什么你改了我还看不见

前提概要 你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就 是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。 转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法…

第五章 Scala 变量与运算符

1 变量 变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你…

MyBatis查询数据库入门学习<一>

目录 1.MyBatis 是什么? MyBatis官网:mybatis – MyBatis 3 | 简介 2.为什么要学习 MyBatis? 3.怎么学MyBatis? 4.第⼀个MyBatis查询 4.1 创建数据库和表 4.2 添加MyBatis框架⽀持 4.2.1 ⽼项⽬添加MyBatis 4.2.2 新项⽬添…

Git时间:版本控制工具进阶

Git时间:版本控制工具进阶 忽略文件 Git允许用户将指定的文件或目录排除在版本控制之外,它会检查代码仓库的目录下是否存在一个名为.gitignore的文件,如果存在,就去一行行读取这个文件中的内容,并把每一行指定的文件…

Matlab的SimuLink对FS32K144编程--SPI通讯控制12bitDAC输出

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 1、硬件介绍,DAC芯片:AD5328BRUZ DAC_SPI_SCK----PTD0(SPI1) DAC_SPI_DIN----PTE0(SPI1)单片…

Android 之 使用 SoundPool 播放音效

本节引言: 第九章给大家带来的是Android中的多媒体开发,与其说是多媒体开发还不如是多媒体相关API的 的使用,说下实际开发中我们做了一些和多媒体搭边的东西:拍照,录音,播放音乐,播放视频... 嗯…

stable-diffusion-webui汉化教程

第一种方法 1.打开stable diffusion webui,进入"Extensions"选项卡 2.点击"Install from URL" 3、注意"URL for extension’s git repository"下方的输入框 4、填入地址:https://github.com/VinsonLaro/stable-diffus…

让企业出海支付流程更加安全,亚马逊云科技推出支付加密服务

在咖啡店买一杯咖啡,在电商平台下单一件商品,其消费流程背后,都要涉及到金融支付的多个环节,而其中对金融数据存储和流通的加密则是保障金融安全的重要环节。 加密是保障消费者支付流程安全的最大挑战。亚马逊云科技首席安全布道…

医学案例|ROC曲线

一、案例介绍 研究者想要进行“糖化血蛋白”的研究,对糖尿病患者和非糖尿病患者各100名检测糖化血红蛋白(HbAlc)含量,希望可以研究糖化血蛋白对患有糖尿病的情况是否有诊断价值,如果有最佳的诊断界值是多少。 二、问…

MQ, RocketMQ, 安装

文章说明 本文主要说明RocketMQ的几种常见的安装方式。之前在工作中也用过RocketMQ,但是一直用的是测试环境上的,也没有自己动手安装过。这次专门抽了时间学习了一下。 文章目录 文章说明参考文献安装windows安装环境要求下载配置环境变量启动注意事项 …

OJ练习第146题——杨辉三角 II

力扣链接:119. 杨辉三角 II 题目描述 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 Java代码(直接法) class Solution {/*** 获取…

程序员自由创业周记#4:从一笔30美元的收入谈起

程序员自由创业周记#4:从一笔30美元的收入谈起 pexels-freestocksorg-127713 本文是一位程序员进行独立开发创业的记录,将分享创业过程中的所思所想以及收支明细。在文末,您还可以找到之前的历史文章。 惊喜之旅 这次的惊喜源于 学伟扫描Pro …