Redis第12讲——缓存的三种设计模式

缓存的使用在项目中是极其常见的,如果使用得当,缓存可谓时提升系统性能的最简单方法之一,反之则会出现一些莫名其妙的问题,在不同场景下,所使用的缓存策略也是有所变化的,下面我们就介绍一下三种常见的缓存设计模式——Cache Aside Pattern(重点)、Read/Write Through Pattern、Write Behind Caching Pattern。

一、Cache Aside Pattern

先看一下我们最经常使用的查询缓存流程:查询请求过来先去读缓存,缓存命中则直接返回,如果未命中就去查数据库,有数据则写入缓存并返回结果,没数据也直接返回,如下图

这个缓存查询流程大家都不陌生,这应该是使用最为广泛的流程,但大部分人可能不知道,这个流程有一个名字:Cache Aside Pattern(旁路缓存模式),这是缓存设计模式的一种,也是Facebook比较推崇的一种模式,上面是该模式的查询流程,而更新流程如下:

ps:到此为止就是Cache Aside Pattern的全部内容了,由于此模式比较重要,下面我们将对其进行延申。

这个大家应该也并不陌生,更新完数据库后再把缓存给删了,下次再有查询请求过来时,就会先从数据库查询出更新后的数据再写入缓存,乍一看这个流程似乎很“完美”,但还有几个点需要我们思考一下:

  • 为什么是先更新数据库再操作缓存,它俩能对调一下吗?
  • 为什么是删除缓存而不是更新缓存?
  • 读写、写写并发下会有什么问题?

1.1 删除缓存VS更新缓存

为了保证数据库和缓存的一致性,很多人会在做数据更新的时候,顺便会把缓存也一并更新了,虽然这是我们正常的思维,但是我要说的是删除缓存要优于更新缓存。

1.1.1 缓存的数据

我们先抛开并发问题,单从缓存的数据方面看。缓存中的数据大部分情况下可能不只是一个简单的字符串,可能是一个大JSON串比如我们需要通过缓存进行扣减库存的时候,可能需要从缓存中查出整个订单模型数据,把它反序列化之后,再解析其中库存的字段,修改后再序列化放进缓存中。

可以看到相比于直接删除缓存,更新缓存更为复杂,也较容易出错。下面我们再来看看这两种操作在并发情况下的表现。

1.1.2 写写并发

"写写并发"下,如果同时更新缓存和数据库,那么就会很容易出现并发问题导致数据不一致的情况。

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

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

可以看到,如果是更新缓存的话,无论是先操作数据库还是先操作缓存,都会出现数据不一致的情况(标红的地方)。但如果是直接删除缓存的话,就不会出现数据不一致的情况。

但它有个小缺点,就是会带来一次额外的cache miss,也就是说删除缓存后的下一次查询无法命中缓存,需要再查一下数据库。

ps:如果同一个key有大量的请求过来,在某种程度上可能会导致缓存击穿,不过可以通过加锁来解决。

所以,删除缓存相较于更新缓存,方案更简单,一致性问题也更少,建议大家优先选择删除缓存。

1.2 先写数据库VS先删缓存

在确定了优先选择删除缓存后,那么先写数据库还是先删缓存呢,下面一起来看看。

1.2.1 先写数据库

在读写并发下:

正常情况下,脏数据时间范围:更新数据库后,删除缓存前。这个时间范围很小,通常不会超过几毫秒。

异常情况下,如果缓存删除失败,会导致数据库中的数据已经更新,而缓存还是旧数据,从而导致数据不一致,但这种情况除非是网络问题或者缓存服务器宕机,否则大部分情况下还是会成功的。

1.2.2 先删除缓存

首先,如果是先删除缓存,那么第二步写数据库失败是可以接收的,因为这样不会有脏数据。

但是,先删除缓存再更新数据库,会放大"读写并发"导致的数据不一致问题。我们知道查询缓存的流程是这样的:

  • 查询缓存,命中则直接返回。
  • 查询数据库。
  • 把数据库的值更新进缓存。

对于一个读线程来说,虽然不会写数据库,但是会写缓存。如下图:

脏数据时间范围:更新数据库后,下一次对该数据更新前。这个时间范围不确定性很大:

  • 如果下一次数据更新马上来,那么会失效缓存,脏数据时间就很短。
  • 如果下一次数据更新很久才到,那么这期间保存的都是脏数据。

通过上述两个方案的比较可以看出,先操作数据库和先操作缓存都会存在脏数据的情况。但相比之下,先操作数据库再操作缓存时更优的方式,即使再并发的情况下,也只会出现很小量的脏数据。

ps:由于篇幅原因,缓存和数据库一致性的解决方案下篇文章再介绍。

二、Read/Write Through Pattern

在Cache Aside中,应用层需要和缓存和数据库两个数据源打交道,这增加了应用层的复杂度,而Read/Write Through Pattern就是来解决这个问题的,在这两种模式下,应用层只需要将缓存作为主要数据源,不需要感知数据库,更新和读取的任务都交给缓存来代理。

2.1 Read Through Pattern

在Read Though模式下,是由缓存配置一个读模块,应用层查询数据时,当缓存未命中时,由缓存去查询数据库,并且将结果写入缓存中,最后返回结果给应用层:

在上述流程图中,红色框内的操作不再由应用层来处理,而是由缓存自己处理。

2.2 Write Though Pattern

在Write Though模式下,是由缓存配置一个写模块,应用层更新数据时,由缓存去更新数据库。同时,当缓存命中时,写缓存和写数据库这两个操作在一个事务中完成,保证同时成功:

 

当使用Write Though时,一般都配合使用Read Though来使用。Write Though适用的场景有:

  • 需要频繁读取相同数据。
  • 不能忍受丢失数据(相对于Write Behind而言)和数据不一致。

在使用Write-Through时要特别注意的是缓存的有效性管理,否则会导致大量的缓存占用内存资源。甚至有效的缓存数据被无效的缓存数据给清除掉。

三、Write Behind Caching Pattern

Write Behind又称为Write Back,从应用层视角来看和Write Through类似,在该模式下,应用层也只需和缓存一个数据源打交道,不同的是Write Through会立即把数据写入数据库,而Write Behind会在一段时间之后(或者被其它方式触发)把数据批量写入数据库,这个异步写操作是Write Behind的最大特点。

这样做的优点是:

  • 应用层操作只写缓存,速度非常快。
  • 缓存在异步地写数据库时,会将多个I/O操作合并为一个,减少I/O次数。

缺点是:

  • 复杂度高。
  • 更新后的数据还未写入数据库时,如果此时断电,数据将无法找回。

Write Behind缓存模式由于其复杂度比较高,所以在业务应用中适用的比较少,但是由于其性能比较好,还是有不少优秀如啊年采用了该模式,比如:linux中的页缓存、Mysql中的InnoDB存储引擎。

 End:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。

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

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

相关文章

appium driver install uiautomator2 安装失败

报错 Installing ‘uiautomator2’ using NPM install spec ‘appium-uiautomator2-driver’ Error: Encountered an error when installing package: npm command ‘install --save-dev --no-progress --no-audit --omitpeer --save-exact --global-style --no-package-lock…

为什么每个人都需要了解这些数据加密技术?

在数字时代,数据加密技术不仅对保护企业的商业秘密至关重要,也是个人隐私安全的重要屏障。随着技术的进步和网络犯罪的增加,数据加密已经成为了信息安全领域的一个热点议题。以下是探讨为什么每个人都需要了解这些数据加密技术的几个主要原因…

Web 前端性能优化之七:数据存储与缓存技术

7、数据存储 在开发Web应用的过程中,会涉及一些数据的存储需求,常见的存储方式可能有: 保存登录态的Cookie; 使用浏览器本地存储进行保存的Local Storage和Session Storage; 客户端数据持久化存储方案涉及的Web SQ…

AI智能调色解决方案,节省了企业的时间和人力成本

如何确保图片、视频的色彩准确、生动,成为企业提升品牌形象和传播效果的重要课题。美摄科技凭借领先的AI技术,推出全新的AI智能调色解决方案,以智能化、精细化的调色方式,帮助企业轻松驾驭色彩,展现视觉魅力。 美摄科…

知乎专业分析二手车

二手车经销商-一个神奇的经济存在体 - 知乎 二手车经销商-一个神奇的经济存在体 - 知乎 1. 本文文字内容较多,近5000字,如果没有兴趣可以看看导图,找到自己感兴趣的环节。 本篇无意为二手车经销商或新车经销商进行判断说谁更高端&#xf…

CentOS7.9创建本地yum源操作步骤报错解决方法

1.基础信息 CentOS7.9-mini最小化安装的系统,在离线安装rpm时候需要大量依赖,需要花费大量时间去查找依赖包。受于环境限制无法接入互联网使用公开yum源,于是便有了搭建本机yum源的想法,在网上下载CentOS7.9标准版“CentOS-7-x86_…

js爬虫puppeteer库 解决网页动态渲染无法爬取

我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来,是因为这个网页这里是实时渲染的,我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …

HarmonyOS4-学习入门知识总结

简单的组件学习: /*** weip 自定义控件* 自定义构建函数也是需要充电的地方,分全局和局部的* 全局:需要添加function关键字 局部:不加function关键字* Styles function 自定义公共样式 分全局和局部* Extends(Text) 继承模式 只…

蚂蚁集团CodeFuse 发布“图生代码”功能,支持产品设计图一键生成代码

4月11日,蚂蚁集团自研的智能研发平台CodeFuse推出“图生代码”新功能,支持开发人员用产品设计图一键生成代码,大幅提升前端页面的开发效率。目前相关功能正在内测。 和很多互联网公司一样,蚂蚁集团正在内部全面推行AI编程&#x…

Ubuntu-22.04安装Virtualbox并安装Windows10

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Virtualbox是什么?二、安装Virtualbox1.关闭Secure Boot2.安装 三、安装Windows101.新装虚拟机基本配置2.新装虚拟机核心配置 总结 前言 虚拟机…

2023图灵奖得主揭晓!史上首位计算机和数学最高奖“双料王”诞生

重磅消息!北京时间4月10日下午5点整,ACM宣布把2023年图灵奖颁给Avi Wigderson,以表彰Wigderson对计算理论和随机性做出的奠基性贡献。 ACM图灵奖通常被称为“计算机领域的诺贝尔奖”,奖金为100万美元,通常颁发给计算机…

优思学院|过程能力指数CPK是谁发明的?

CPK指数的发明并没有明确归功于某个特定的个人。 它是质量管理和统计过程控制领域中的一个概念,是在多年的实践和研究中逐渐发展形成的。Cpk作为衡量过程性能的工具之一,其理论基础主要来源于统计过程控制(SPC)和质量管理的原理&…

软件建模与设计 —— 入门

序言 对于软件建模与设计,非科班出身的同学可能和我一样比较陌生,虽然日常开发中也涉及到建模,但是并没有系统的学习过软件建模设计。类似于设计模式,软件建模与设计也有一套三板斧。 设计模式 创建型模式提供了创建对象的机制…

基于GAN的多变量时间序列污染训练集异常检测

论文地址:https://ieeexplore.ieee.org/document/9618824 论文源码:https://github.com/sxxmason/FGANomaly 期刊:IEEE Transactions on Knowledge and Data Engineering 多元时间序列异常检测在结构健康监测、智能运维、量化交易等诸多实际…

【C++】模版

目录 一、泛型编程二、函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 三、类模板3.1 类模板的定义格式3.2 类模板的实例化 四、非类型模板参数五、模板的特化5.1 概念5.2 函数模板特化5.3 类模板特化5.3.1 全特化5.3…

google map POI获取

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 一、需求背景 因业务发展,需获取全美(或任意国家)所有POI(标记点)信息,包括mark_id、mark_name、address、numb…

JavaThread线程

目录 程序--进程--线程 程序: 进程: 线程: 进程和线程的关系 创建线程 单线程模式 代码 图解 运行 代码 运行 创建线程 方式一 代码 运行 方式二 代码 运行 总结: Thread类中常用的方法 1、 代码 运行…

python统计分析——一般线性回归模型

参考资料:python统计分析【托马斯】 当我想用一个或多个其他的变量预测一个变量的时候,我们可以用线性回归的方法。 例如,当我们寻找给定数据集的最佳拟合线的时候,我们是在寻找让下式的残差平方和最小的参数(k,d): 其…

YooAsset快速入门

文章目录 YooAsset快速入门指南:YooAsset学习核心要掌握的要点主要包括以下几个方面:基于YooAsset进行游戏资源管理的应用实例 YooAsset快速入门指南: YooAsset是一款专为游戏开发设计的资产管理和分发系统,它能够帮助开发者高效…

服务器挖矿病毒解决ponscan,定时任务解决

服务器挖矿病毒解决ponscan,定时任务解决 挖矿病毒会隐藏chattr的操作权限,让我们无法删除病毒文件,杀掉病毒进程。所以要去下载chattr.c的文件,编译成a.out。然后再对原来的chattr文件的权限进行修改。然后覆盖掉它。 chattr.c …