关于先更新再缓存这种缓存方案设计的思考

这两天正在做公司缓存方面的设计,然后就把自己的思考过程整理一下。

网上对于这块的内容讲解也非常的多,有些说的也都非常的在理,关于缓存一致性的方案也就那么几种,如:先更新、再删,先删、在更新,先更新再更新等,然后围绕这些方案产生的问题有衍生出了+rocketmq方案或者+binlog&rocketmq方案,有兴趣的大家可以自己搜索。

本篇内容主要是我在整理更新、再删这种方案时的思考,欢迎一起讨论。

读写不分离场景

期望结果

image-20231204112715166

这种方式在网上的推荐比较多,原因是出错概率小,实现起来比较简单,对于一般规模不大的系统足矣。深度思考,会发现以下几个问题:

1、如果服务B更新频率高,服务C读取频率低,对整个方案会有什么影响?

频繁的更新Mysql(RW)会导致Mysql(RW)的压力变大,但只对Redis做缓存删除,因此对Redis的影响微乎其微。

因为Redis的缓存总是被删除,因此服务C在每次读取缓存时都会先读取数据库然后更新缓存,这种情况下服务C中缓存的机制就失去了意义,也会对服务C性能造成一定的影响。

小概率会出现缓存击穿、缓存雪崩、缓存穿透等问题。

2、如果服务B更新频率低,服务C读取频率搞,对整个方案会有什么影响?

Mysql(RW)的更新频率低,也就是意味着缓存的更新频率低,对于服务C来说也就不用频繁的到Mysql(RW)中去查询数据,服务C少了和Mysql(RW)的交互,在性能上也能大幅提升。

但是服务C读取频率高,大概率会出现缓存击穿、缓存雪崩、缓存穿透等问题。尤其是缓存击穿问题,当高并发情况下缓存突然失效,这时就会因为缓存不命中,导致大量的请求开始读取Mysql(RW)以及更新Redis,从而给Mysql(RW)和Redis造成性能影响。

极端情况一

image-20231204112733980

如果Mysql(RW)更新失败,但是Redis删除成功会有什么影响?

存在一定影响,因为在服务B中更新Mysql(RW)失败了,但是删除Redis却成功了,从业务上来说,在这一步就产生了缓存不一致问题。但是又因为删除Mysql(RW)失败,数据库的值没有变化,服务C读取的数据也就没有变化,从服务C来说缓存也就没有改变,不存在缓存一致性问题。

极端情况二

image-20231204112747629

如果服务B缓存删除失败,对整个方案会有什么影响?

在服务B中如果Redis删除失败,则会导致Redis中的缓存值在一定时间之内和Mysql(RW)中不一致,如果没有其它方式介入,只能等到缓存失效,下一次请求进来时重新更新缓存,这种情况产生的风险非常大。如果是商详页或者商城首页,出现这问题直接就GG了。

读写分离场景

期望结果

image-20231204112821601

当下项目规模都很大,公司Mysql数据库多数采用主从库、读写分离的部署方式,主库和从库之间通过binlog机制进行同步,主库数据的变动可以实时同步到从库。

主从同步机制自身也存在很大的问题,比如,当主库写入量非常多,或者主从库网络不通畅,这就使binlog同步存在数据延迟,导致主库和从库数据存在不一致情况,读写分离场景下,主库和从库之间同步延迟的时间,也是导致缓存不一致的主要原因。

深度思考以下几个问题:

1、如果服务B更新频率高,服务C读取频率低,对整个方案会有什么影响?

频繁的更新Mysql(W)会导致Mysql(W)的压力变大,但只对Redis做缓存删除,因此对Redis的影响微乎其微。

但是,如果服务B产生大量的数据变动,这就会使binlog同步延迟,同样的,网络延迟也会导致binlog同步延迟,这就导致了当Redis缓存过期时,服务C从Mysql(R)中读取的数据可能不是最新的,最终导致缓存不一致问题。

小概率会出现缓存击穿、缓存雪崩、缓存穿透等问题。

2、如果服务B更新频率低,服务C读取频率搞,对整个方案会有什么影响?

服务B上Mysql(W)的更新频率低,也就是意味着缓存的删除频率低,产生的变动数据少,对于binlog同步来说产生延迟也就越小(假设不考虑网络原因),对于Mysql(R)来说,binlog同步延迟越低,数据一致性就越高。同样的,网络的延迟问题也是需要考虑的。

总结一下,在读写分离场景下,不仅binlog自身同步会影响缓存一致性,网络问题也会影响缓存一致性,这就使得在读写分离场景下实现缓存一致性会有更高的挑战。

极端情况

image-20231204112840215

当服务B在主库更新完Mysql(W)数据库,并且从Redis删除缓存,从库通过binlog进行数据同步,由于数据积压、网络延迟,从库一直未能和主库数据保持一致。

但是在这时服务C有新的请求进入,并且由于缓存过期,需要从从库获得数据,但是由于从库未和主库数据保持一致,因此服务C从从库获得数据并不是最新的,这也就导致了缓存不一致问题。

核心总结

  1. 比较适合读写不分离的场景,如果是读写分离场景,一定要充分考虑binlong同步延迟和网络延迟带来的缓存不一致问题。
  2. 比较适合写少读多的的业务场景,频繁的写入同时也会频繁的删除缓存,对于读取频率低的服务C来说,缓存也就失去了意义,因为每次都得要重新获得数据库数据。
  3. 缓存一定要设置有效期,非常重要。如果不设置会导致当缓存不一致时,永远不能和数据库保持一致。
  4. 要充分考虑更新失败和删除失败的策略
  5. 其它???

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Polar靶场WEB签到】

题目&#xff1a; <?phperror_reporting(0);$file $_GET[file];if(!isset($file))$file 1;$file str_replace(../, , $file);include_once($file.".php");highlight_file(__FILE__); ?>解答&#xff1a;1、进入index页面&#xff0c;说让你加弟弟&#x…

WordPiece词表的创建

文章目录 一、简单介绍二、步骤流程2.1 预处理2.2 计数2.3 分割2.4 添加subword 三、代码实现 本篇内容主要介绍如何根据提供的文本内容创建 WordPiece vocabulary&#xff0c;代码来自谷歌&#xff1b; 一、简单介绍 wordpiece的目的是&#xff1a;通过考虑单词内部构造&…

算法通关村第十七关-青铜挑战贪心算法思想

大家好我是苏麟 , 今天说说贪心算法 . 贪心思想很难用理论解释&#xff0c;本文我们先通过案例来感受一下贪心是如何解决问题的 大纲 难以理解的贪心算法贪心问题举例分发饼干柠檬水找零分发糖果 难以理解的贪心算法 贪心的思想非常不好解释&#xff0c;而且越使用权威的语言解…

【隐私计算】安全三方计算(3PC)的加法和乘法计算协议

ABY3中采用replicated secret sharing&#xff08;复制秘密分享&#xff09;机制&#xff0c;即2-out-of-3秘密分享&#xff0c;三个参与方的每一方都拥有share中的两份。下面来看一下这样做有什么好处。 2-out-of-3秘密分享 有 x , y x, y x,y两个操作数&#xff0c;先进行秘…

ttkefu在线客服软件新版即将上线——引领客服行业迈向新篇章

在线客服软件已经成为企业与用户之间沟通的重要桥梁。作为领先的客服解决方案提供商&#xff0c;ttkefu即将推出全新版本的在线客服软件&#xff0c;为客服行业注入新的活力。 一、ttkefu新版在线客服软件的主要特点 智能化客户管理&#xff1a;新版软件将采用先进的自然语言…

sd_webui的实用插件,prompt/lama/human matting/...,持续开源更新!!

热烈欢迎大家在git上star&#xff01;&#xff01;&#xff01;冲鸭&#xff01;&#xff01;&#xff01; 1.prompt优化插件 GitHub - leeguandong/sd_webui_beautifulprompt: beautifulprompt extension performs stable diffusion automatic prompt engineering on a bro…

抖音本地生活服务商申请入口在哪里?具体流程是怎样的?

不论是抖音的本地生活业务&#xff0c;还是后来的支付宝、视频号的本地生活业务&#xff0c;因为市场体量足够庞大&#xff0c;市场前景广阔&#xff0c;一直很受各大创业者的追捧。那么&#xff0c;如此火热的本地生活项目&#xff0c;想要申请成为服务商&#xff0c;具体的申…

某60区块链安全之JOP实战二学习记录

区块链安全 文章目录 区块链安全Jump Oriented Programming实战二实验目的掌握对EVM逆向能力实验环境实验工具实验原理实验内容Jump Oriented Programming实战二 实验步骤Jump Oriented Programming实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约中中Jum…

26、卷积 - 实际上是一个特征提取器

矩阵乘法的本质是特征的融合&#xff0c;卷积算法的本质是特征的提取。 回想一下之前所有介绍卷积的时候&#xff0c;描述了一种卷积运算的场景&#xff0c;那就是一个窗口在图片上滑动&#xff0c;窗口中的数值是卷积核的参数&#xff0c;也就是权值。 卷积的计算本质是乘累…

axios使用

Get请求 Post请求 出问题了&#xff1a; 并发请求 全局配置 多个实例如何处理 拦截器 axios在Vue中的模块封装

Install4J安装界面中如何使用脚本找到依赖程序XShell的安装位置

前言 写了一个工具, 使用Install4j打包, 但因为需要用到XShell, 所以希望在安装界面能够提前让用户配置好XShell的安装位置, 所以对Install4j的安装界面需要自定义, 后期在程序中直接过去安装位置就可以正常使用. 调研 和git-bash不一样, 安装版的XShell没有在注册表里存储安…

FL Studio2024破解版本补丁包下载

FL Studio是一款出色的编曲软件&#xff0c;最新版本的FL Studio21新增了四款全新的插件&#xff0c;覆盖了音频设计、延迟、相位器等等。通过软件的不断更新&#xff0c;我们可以享受到更加智能的电子音乐创作工具&#xff0c;目前&#xff0c;FL Studio的正式版已经推出了超过…

产品创新受赞誉,怿星荣获2023未来汽车(电子和软件)创新创业大赛一等奖

2023未来汽车&#xff08;电子和软件&#xff09;创新创业大赛 11月29日&#xff0c;上海临港&#xff0c;由中国汽车工程学会和中国&#xff08;上海&#xff09;自由贸易试验区临港新片区管理委员会联合举办的“2023未来汽车&#xff08;电子和软件&#xff09;创新创业大赛…

NSSCTF 文件上传漏洞题目

目录 [SWPUCTF 2021 新生赛]easyupload1.0 [SWPUCTF 2021 新生赛]easyupload2.0 [SWPUCTF 2021 新生赛]easyupload3.0 [SWPUCTF 2021 新生赛]easyupload1.0 这是一个文件上传漏洞的题目 我们的思路是上传一句话木马&#xff0c;用工具进行连接 先编写一句话木马 将文件后缀…

一位半加法器,一位全加器,四位全加器

我们这里的加法器只考虑一位的情况。 当我们两个一位相加的话&#xff0c;那么就有两个输入&#xff0c;两个输出&#xff0c;两个输入很好理解&#xff0c;就是两个个位上的数字&#xff0c;0或者是1&#xff0c;那么为什么需要有有个输出呢&#xff1f;难道不是输出一个数就…

麒麟linux将图片批量生成PDF的方法

笔者手里有一批国产linu系统&#xff0c;目前开始用在日常的工作生产环境中&#xff0c;我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux&#xff0c;统信UOS等&#xff0c;基本都是基于debian再开发的linux。 问题描述&#xff1a; wind…

28、卷积 - 卷积的基础公式

本节推导一下卷积的基础公式,还是先上一张卷积运算的示意图图。 我们知道,一张图片有 3 个维度,分别是长、宽、通道。 这三个维度分别用 3 个字母代替,分别是 H(Height, 对应的是长这一维度), W(Width, 对应的是宽这一维度),C(Channel,对应的是通道这一维度)。 对于…

unity学习笔记19

一、角色动画的使用练习 从资源商店导入的动画资源&#xff08;Character Pack: Free Sample&#xff09;中将资源中的角色创建在场景里&#xff0c;现在场景里存在的角色并没有任何动画。 在资源中找到Animations文件夹&#xff0c;在这个文件有很多模型文件&#xff08;.FBX…

PYthon数据分析学前导语

文章目录 1.学习计划1.1 第一阶段&#xff1a;数据分析阶段1.2 第二阶段&#xff1a;可视化阶段1.3 第三阶段&#xff1a;项目实战阶段 2. 相关工具库的安装2.1.Pandas与Numpy的安装2.2 matplotlib, seaborn, Pyecharts的安装 1.学习计划 欢迎开始Python数据分析系列博客的学习…

Swift 如何实现自定义 Tab Bar

前言 每个 UI 设计师都喜欢美丽而有动画效果的 Tab Bar。然而&#xff0c;对于开发人员来说&#xff0c;实现这种设计可能是一场噩梦。当然&#xff0c;使用 Apple 的原生 Tab Bar 组件并专注于更有趣的事情&#xff0c;比如业务逻辑的实现&#xff0c;会更容易。但如果我们必…