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

news2024/11/25 10:23:51

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

网上对于这块的内容讲解也非常的多,有些说的也都非常的在理,关于缓存一致性的方案也就那么几种,如:先更新、再删,先删、在更新,先更新再更新等,然后围绕这些方案产生的问题有衍生出了+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.coloradmin.cn/o/1287707.html

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

相关文章

Linux中的网络配置

本章主要介绍网络配置的方法 网络基础知识查看网络信息图形化界面修改通过配置文件修改 1.1 网络基础知识 一台主机需要配置必要的网络信息,才可以连接到互联网。需要的配置网络信息包括IP、 子网掩码、网关和 DNS 1.1.1 IP地址 在计算机中对IP的标记使用的是3…

JRT导出协议实现

之前实现了JRT的打印客户端实现,这次实现JRT的导出Excel的客户端实现,这样这套框架就成为完全体了。还是一样的设计,不面向具体业务编程,我喜欢面向协议编程,导出一样定义了一套协议。 协议约定: 然后就是…

openEuler操作系统安装

所需要的软件镜像 https://repo.openeuler.org/openEuler-20.03-LTS/ISO/x86_64/ 选择openEuler-20.03-LTS-everything-x86_64-dvd.iso 版本的最完整 如果硬盘空间小可选择openEuler-20.03-LTS-x86_64-dvd.iso 安装步骤 1 选择第一个 install openEuler 20.03-LTS 2 选择语…

鸿蒙Harmony开发初探

一、背景 9月25日华为秋季全场景新品发布会,余承东宣布鸿蒙HarmonyOS NEXT蓄势待发,不再支持安卓应用。网易有道、同程旅行、美团、国航、阿里等公司先后宣布启动鸿蒙原生应用开发工作。 二、鸿蒙Next介绍 HarmonyOS是一款面向万物互联,全…

mysql原理--InnoDB记录结构

1.InnoDB行格式 我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。 设计 InnoDB 存储引擎的大叔们到现在为止设计了4种不同类型的 行格式 ,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行…

罗技鼠标使用接收器和电脑重新配对

罗技鼠标使用接收器和电脑重新配对 文章目录 罗技鼠标使用接收器和电脑重新配对1\. 前言2\. 安装软件3\. 进行配对3.1. 取消之前的配对3.2. 重新配对3.3 配对完成 4\. 报错4.1. 重新配对时显示配对未成功 1. 前言 罗技的鼠标出厂的时候,默认的是将通道一设置为接收…

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器部署Gogs服务

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器(Elastic Compute Cloud)是亚马…

Redis穿透以及解决方法

Redis穿透是指当一个请求在缓存中和数据库都找不到对应的数据时,导致每次请求都要查询数据库,从而产生了大量的无效数据库查询,大量无效的数据库查询会导致数据库负载增加,降低数据库的性能和响应能力甚至宕机的风险。 这种情况通…

nodejs+vue+微信小程序+python+PHP天天网站书城管理系统的设计与实现-计算机毕业设计推荐

本项目主要分为前台模块与后台模块2个部分,详细描述如下:   (1)前台模块 首页: 首页可以起到导航的作用,用户想要了解网站 ,网站首页为用户可以深入了解网站提供了一个平台,它就向一个“导游”…

【模型可解释性系列一】树模型-拿到特征重要度-打印关键因素

接下来一段时间内,会主要介绍下模型可解释性方向的一些常用方法。 模型可解释性:主要用来解释为什么这个样本的特征是这样的时候,模型结果是那样。面向老板汇报工作(尤其是不懂算法的老板)和业务方。 常用的树模型 xgboost、lightgbm这两个…

京东数据分析:2023年10月京东打印机行业品牌销售排行榜

鲸参谋监测的京东平台10月份打印机市场销售数据已出炉! 10月份,打印机市场整体销售下滑。鲸参谋数据显示,今年10月份,京东平台打印机的销量将近60万,环比降低约2%,同比降低约5%;销售额为4.4亿&a…

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

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

通过keepalived+nginx实现 k8s apiserver节点高可用

一、环境准备 K8s 主机配置: 配置: 4Gib 内存/4vCPU/60G 硬盘 网络:机器相互可以通信 k8s 实验环境网络规划: podSubnet(pod 网段) 10.244.0.0/16 serviceSubnet(service 网段): 1…

quickapp_快应用_快应用与h5交互

快应用与h5交互 h5跳转到快应用[1] 判断当前环境是否支持组件跳转快应用[2] h5跳转到快应用(1)deeplink方式进行跳转(推荐)(2)h5点击组件(接收参数存在问题)(3)url配置跳转(官方不推荐) 问题-浏览器问题 web组件h5页面嵌入快应用快应用发送消息到h5页面h5页面接收快应用发送的消…

微前端 前置知识2--- monorepo架构

目录 前言 pnpm vs npm pnpm设计思想 硬连接 软链接 (符号链接) 原理 pnpm 指令 monorepo架构 介绍 配置monorepo pnpm --filter 前言 我们采用的是微前端一个主应用,和多个子应用,我们肯定不会一个一个去install安装…

【教程】苹果推送证书的创建和使用流程详解

摘要 本篇博客主要介绍了苹果推送证书的使用流程。首先,在苹果开发者中心创建推送证书,然后在应用程序中使用该证书进行消息推送。文章详细说明了创建推送证书的步骤,并提供了在应用程序中注册推送服务、发送推送消息以及处理推送消息的相关…

CentOS最小化安装后怎么转图形界面/可视化桌面?

文章目录 1、命令行和图形界面切换方式一方式二 2、最小化安装转桌面1-设置网络2-测试网络3-更新文件4-安装图形5-查看默认6-设置默认 界面效果参考视频 1、命令行和图形界面切换 如果安装的是最小化,那么init 5 (进入图像化桌面)命令是无效的 方式一 1.如果在命…

把 Windows 11 装进移动硬盘:Windows 11 To Go

本篇文章聊聊如何制作一个可以“说带走就带走”的 Windows 操作系统,将 Windows11 做成能够放在 U 盘或者移动硬盘里的 WinToGo “绿色软件”。 写在前面 在《开源的全能维护 U 盘工具:Ventoy》这篇文章的最后,我提到了一个关键词 “WinToG…

带你学C语言:带你学函数

目录 🌍函数的概念 ★★☆☆☆库函数 ★★★★☆自定义函数 ★★★☆☆形参与实参 ★★★☆☆return语句 ★★★☆☆数组做函数参数 ★★★☆☆嵌套调用和链式访问 ★★★☆☆函数的声明和定义 ✍结束语 🌍函数的概念 数学中我们其实就见过函数…

校园局域网规划设计

摘 要 随着网络技术的发展,校园网的建设已经进入到一个蓬勃发展的阶段。校园网的建成和使用,对于提高教学和科研的质量、改善教学和科研条件、加快学校的信息化进程,开展多媒体教学与研究以及使教学多出人才、科研多出成果有着十分重要而深远…