缓存和数据库双写的四种策略分析

news2024/9/22 11:36:06

概述

        缓存是提升系统性能的极为简便的手段之一。相较而言,数据库(或者 NoSQL 数据库)的运行速度较为迟缓,然而速度在很多时候却是决胜的关键要素。采用缓存能够降低响应时间、减轻数据库负载并且节约成本。 正因如此,往往需要同时对数据库和缓存进行写入操作,不同的缓存策略在处理读写操作、确保数据一致性以及优化系统性能等方面均具备各自的特性与适用场景。选择恰当的缓存策略乃是提升性能的关键所在。

        本文梳理了几种常见的缓存策略,例如 Cache Aside、Read/Write Through、Write-Around 以及 Write Back 等,剖析了它们的工作原理、优点与缺点,以及在实际应用中的考量要点,助力您在开发过程中作出明智的抉择,从而构建出高效且可靠的系统。

46ca10431b3b4bc59c9c3128a3f23f3e.png

一、CacheAside策略

        CacheAside,即旁路缓存,是业界应用最为广泛的缓存业务代理方式。通过 Facebook 的论文《Scaling Memcache at Facebook》能够了解到,Facebook 公司内部同样采用了这一策略。

查询流程:首先于缓存中进行查询,如果命中缓存,则直接返回结果;倘若未命中,则前往数据库获取数据,获取成功后,再将数据存入缓存。
新增操作:将数据新增至数据库,缓存不进行任何操作。
更新操作:把数据更新至数据库,成功之后,使缓存失效。
删除操作:在数据库中删除数据,成功之后,令缓存失效。

1a9fdc236fe34a6f8e1e1d9a80254b05.png

CacheAside会有什么问题吗?

假设存在两个请求,一个请求 A 执行查询操作,另一个请求 B 执行更新操作,那么可能会出现如下情况。
缓存不存在。
请求 A 从数据库查询获取旧值。
请求 B 将新值更新至数据库。
请求 B 删除缓存。
请求 A 将查询到的旧值写入缓存。

b87c0e92dbca4fcba48a2c93cbf7b58f.png

不过发生上述情况有一个先天条件:

1、进行读操作时,缓存中没有数据,这样他才会去数据提供方获取数据

2、在进行读操作的同时,存在一个写操作

3、读操作在数据提供方读取数据所耗费的时长大于写操作,这种情况较为罕见。

4、在在读写操作并发时,读取到的是旧值。

单独论及一条,正常情况下,读操作要比写操作迅速得多,所以上述四条同时满足的概率极低。

那么,要解决上述问题有什么办法呢?是有的,那便是采用延迟双删方案:
        延迟双删是一种用于保障数据一致性的常见策略,其基本理念在于更新数据库之后,先删除缓存,接着等待一段时间,然后再次删除缓存。这样做的目的是为了避免在数据库和缓存主从同步的过程中,有其他请求查询到旧的缓存数据,并重新写回到缓存中。具体流程如下:

1、删除缓存数据

2、更新数据库数据

3、休眠一段时间,时间依据数据的读取耗费的时间而定。

4、再次删除缓存数据

二、Read/WriteThrough策略

       在 Cache Aside 中,尽管出现数据不一致的概率极低,我们也采用了延迟双删,但依旧较为复杂。不过,若要规避缓存不一致的情况也较为简单,即在进行写入操作时,直接将结果写入缓存,然后从缓存同步写入到数据提供方。等到写入数据提供方的操作完成之后,才返回写入操作的结果。这便是 Read/Write Through 写入机制。
        在这种机制下,调用方仅需与缓存进行交互,无需关注缓存后方的数据提供方。而由缓存来确保自身数据与数据提供方的一致性。读操作仅与缓存打交道,直接读取缓存的结果;写操作的话,调用方写入缓存,再由缓存同步写入数据提供方。

eb33b23e317c495ca65a1a2e6befefdf.png

c9abc230c18f4e18918d4b00d2dcde8f.png


与 Cache-Aside 的区别:
        在 Cache Aside 机制中,数据写入缓存的操作,是由调用方的查询结果触发的。
而在 Read/WriteThrough 机制中,则要求缓存在启动时,自身完成将所有数据从数据提供方读入缓存的过程(在项目启动时,倘若真正初始化时一无所有,也没有需要读取的内容,后续有修改,缓存便是新的数据,也就无需读取)。
比较一下 Cache Aside 和 Read/WriteThrough 机制。在 Cache Aside 中,缓存仅仅是一个辅助的角色,即便缓存不工作,调用方也能够通过数据提供方完成所有的读写操作,正如其名称所示,缓存在一旁。
        然而在 Read/write through 中,缓存直接与调用方对接,屏蔽了数据提供方,这意味着缓存系统不可或缺,且要求极为可靠。

三、Write-Around策略

        在这种策略下,数据直接写入数据库,只有被读取的数据才能够进入缓存。Write-around 能够与 read-through 结合运用,并在数据只写一次、读取次数较少或者从不读取的情况下展现出良好的性能。同样,这个模式也能够与 cache-aside 组合使用。

50d25499425542668c926645ba4d4712.png

四、WriteBack策略

        Write-back方法与write-through非常相似,只是数据库写调用是异步的。在这种策略下,应用程序将数据写入缓存,缓存会立即确认,并在延迟一段时间后将数据写入数据库。有时这种策略也被称为 write-behind。

优缺点

        Write-back缓存提高了写性能,对于写工作量大的工作负载非常有用。当与read-through相结合的时候,它对于混合工作负载非常有效,最近更新和访问的数据总是在缓存中可用。它对数据库故障具有很大程度上的弹性,可以容忍一些数据库的宕机。如果支持批处理或合并,则可以减少对数据库的总体写操作,这将减少负载并降低成本。

主要缺点是,如果缓存失效,数据可能会永久丢失。大多数关系数据库存储引擎(例如InnoDB)的内部都默认启用了回写缓存。查询首先写入内存,最后刷新到磁盘。

4e4d888d4189466ea953c9e840fb95af.png

总结

        在本文当中,我们探讨了不同的缓存策略以及它们各自的优缺点。在实际应用中,请仔细评估您的目标,理解数据访问(读/写)模式,并选择最为适宜的策略或者组合策略。

        例如,如果在实际应当使用 write-around/read-through 时选择了 write-through/read-through(访问写入数据的频率较低),那么缓存中将会存在无用的垃圾。可以说,如果缓存足够大,或许没有问题。但在众多实际的高吞吐量系统中,当内存永远不够大并且需要考虑服务器成本时,正确的策略至关重要。

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

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

相关文章

银河麒麟搭建ftp服务器

1.先 查看系统架构,一般银河麒麟都是arrch64的 lscpu uname -a cat /etc/os-release 去下载对应版本的vsftp.rpm包和ftp包 Index of /NS/ (cs2c.com.cn) 1.安装rpm rpm -ivh *.rpm --nodeps --force #强制安装 2.修改配置文件 vi /etc/vsftpd/vsftpd.conf anon…

卡片式组件封装demo

效果视频: 卡片组件 样式还得细调~,时间有限,主要记录一下逻辑。 html结构: 目录 父组件数据处理数据格式 父组件的全部代码 子组件数据处理props参数 样式部分三个圆点点击三圆点在对应位置显示查看弹框点击非内容部分隐藏查看…

《系统架构设计师教程(第2版)》第12章-信息系统架构设计理论与实践-03-信息系统架构设计方法-ADM架构开发方法

文章目录 1. TOGAF概述1.1 概念1.2 目标1.3 包括的组件1.4 特色 2. ADM 架构开发方法2.1 ADM 的架构开发阶段2.2 各阶段的活动2.3 ADM方法的详细说明2.3.1 准备阶段2.3.2 阶段A——架构愿景2.3.3 阶段 B——业务架构2.3.4 阶段C——信息系统架构3.2.5 阶段 D——技术架构3.2.6 …

STM32智能家居系统教程

目录 引言环境准备智能家居系统基础代码实现:实现智能家居系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:家居智能化管理问题解决方案与优化收尾与总结 1. 引言 智能家居系统通过STM32嵌入…

R语言优雅的把数据基线表(表一)导出到word

基线表(Baseline Table)是医学研究中常用的一种数据表格,用于在研究开始时呈现参与者的初始特征和状态。这些特征通常包括人口统计学数据、健康状况和疾病史、临床指标、实验室检测、生活方式、社会经济等。 本人在既往文章《scitb包1.6版本发…

Go语言中的并发

简单介绍go中的并发编程. 涉及内容主要为goroutine, goroutine间的通信(主要是channel), 并发控制(等待、退出). 想查看更多与Go相关的内容, 可以查看我的Go编程栏目 Goroutine 语法 在一个函数调用前加上go即可, go func(). 语法很简单, 可以说是并发写起来最简单的程序语言…

数据结构(Java):力扣 二叉树面试OJ题(二)【进阶】

目录 💎 1、题一:二叉树的层序遍历 🌟 1.1 思路1(递归求解) 🌟 1.1.1 思路1代码 🔆 1.2 思路2(队列求解) 🔆 1.2.1 思路2代码 💎 2、题二&…

2024.7.16日 最新版 docker cuda container tookit下载!

nvidia官方指导 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 其实就是这几个命令,但是有墙: curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/shar…

【JavaEE】-- 网络编程基础概念(详解)

🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

AV1技术学习: Compound Prediction

一、双向 Compound Prediction AV1支持两个参考帧的预测通过多种复合模式线性组合。复合预测公式为 其中,权重m(x, y) is scaled by 64 以进行整数计算,R1(x, y)和R2(x, y)表示两个参考块中位于(x, y)的像素。P(x, y)将按比例缩小 1/64 以形成最终的预测…

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

MyPostMan 迭代文档管理、自动化接口闭环测试工具(自动化测试篇)

MyPostMan 是一款类似 PostMan 的接口请求软件,按照 项目(微服务)、目录来管理我们的接口,基于迭代来管理我们的接口文档,文档可以导出和通过 url 实时分享,按照迭代编写自动化测试用例,在不同环…

定制QCustomPlot 带有ListView的QCustomPlot 全网唯一份

定制QCustomPlot 带有ListView的QCustomPlot 文章目录 定制QCustomPlot 带有ListView的QCustomPlot摘要需求描述实现关键字: Qt、 QCustomPlot、 魔改、 定制、 控件 摘要 先上效果,是你想要的,再看下面的分解,顺便点赞搜藏一下;不是直接右上角。 QCustomPlot是一款…

Spring中IoC容器和Bean

目录 IoC(Inversion of Control)控制反转思想 Spring技术对IoC思想的实现 DI(Dependency Injection)依赖注入 目标 最终效果 IoC入门案例 传统方法,不使用IoC思想调用dao层 使用IoC思想调用dao层 第一步:导入Spring坐标 第二步:创建…

stm32:CAN通讯

目录 介绍 协议层 CAN的 帧/报文 种类 数据帧 远程帧(遥控帧) 错误帧 过载帧 帧间隔 总线仲裁 stm32的CAN外设 工作模式 测试模式 功能框图 时序 标准时序 例子 环回静默模式测试 寄存器代码 HAL版本 介绍 一种功能丰富的车用总线标…

【ffmpeg命令入门】重新编码媒体流、设置码率、设置帧速率

文章目录 前言ffmpeg的描述重新编码媒体流重新编码媒体流的命令ffmpeg支持的媒体流 设置视频码率视频码率是什么设置视频的码率 设置文件帧数率帧数率是什么ffmpeg设置帧数率 总结 前言 在数字媒体处理领域,ffmpeg是一款非常强大的工具,它可以用来进行媒…

自动化产线 搭配数据采集监控平台 创新与突破

自动化产线在现在的各行各业中应用广泛,已经是现在的生产趋势,不同的自动化生产设备充斥在各行各业中,自动化的设备会产生很多的数据,这些数据如何更科学化的管理,更优质的利用,就需要数据采集监控平台来完…

解决Ubuntu 20.04下外接显示屏无信号问题【多次尝试无坑完整版!!!】

解决Ubuntu 20.04下外接显示屏无信号问题【多次尝试无坑完整版!!!】 一、引言 作为一名开发者,我经常在Windows和Ubuntu之间切换,以满足不同的开发需求。最近,我在使用惠普暗影精灵9(搭载RTX 4…

HLS加密技术:保障流媒体内容安全的利器

随着网络视频内容的爆炸性增长,如何有效保护视频内容的版权和安全成为了一个亟待解决的问题。HLS(HTTP Live Streaming)加密技术作为一种先进的流媒体加密手段,凭借其高效性和安全性,在直播、点播等场景中得到了广泛应…

隐性行为克隆——机器人的复杂行为模仿学习的新表述

介绍 论文地址:https://arxiv.org/pdf/2109.00137.pdf 源码地址:https://github.com/opendilab/DI-engine.git 近年来,人们对机器人学习进行了大量研究,并取得了许多成果。其中,模仿学习法尤其受到关注。这是一种从人…