缓存更新策略分析

news2024/10/9 10:26:43

缓存常用于读多写少的场景,用于缓存结果数据,降低响应时间,提高服务性能。

通常缓存与数据库一起使用,数据库负责持久化,缓存负责高性能。

数据库无法同时满足持久化与高性能,所以引入缓存解决高性能问题。

缓存与数据一起使用时,何时操作缓存,是在操作数据库之前还是之后,如何操作缓存,是更新还是删除,操作失败是否会产生较大影响,都是我们需要考虑的重点问题。

在讨论具体问题前需要明确一下关键点:

  1. 缓存更新策略目标是?

  1. 目标是尽可能读取到正确数据。

  1. 何为正确数据?

以数据库数据为准,读取到当前数据库的最新数据即为正确数据。

  1. 要求读强一致吗?

不要求。该场景要求尽可能读取到正确数据。不使用复杂的2PC或Paxos多数派协议技术,尽可能降低并发时脏数据的概率。

  1. 与多副本数据一致性技术场景相似吗?

不相似。多副本数据一致性解决的是可用性问题,要求多数副本全量数据一致。数据库与缓存解决的高性能的问题,要求尽可能读取到正确数据即可,不要求缓存中有全量数据。

  1. 将缓存和数据库看成一个单一存储?

不将缓存和数据库看成一个单一存储。本场景中由应用协调缓存与数据库异构存储来满足服务高性能场景需求。

更新策略重点

  1. 缓存更新策略目标是尽可能读取到正确数据。

  1. 应用协调操作 缓存 数据库

  1. 缓存操作分为 更新删除

  1. 缓存和数据库操作都存在失败情况。

  1. 应用并发操作 缓存数据库

缓存更新策略设计,需综合考虑以上问题与方法,实现业务正确性与高性能。

更新策略分析

抛开已有的缓存更新模式,考虑缓存更新策略。

缓存操作分为更新与删除,更新缓存因存在以下严重问题,所以不考虑:

  1. 并发写更新缓存,存在数据不一致的问题

  1. A更新缓存 B更新缓存 B更新数据库 A更新数据库(数据库值为a,缓存值为b)

  1. A更新数据库 B更新数据库 B更新缓存 A更新缓存(数据库值为b,缓存值为a)

  1. 先更新缓存后更新数据库,存在读取未更新到数据库的数据

  1. A更新缓存,B读取缓存,A更新数据库(B读取到未更新到数据库的数据)

以下讨论删除缓存策略:

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

该缓存更新策略操作过程为:

  1. 请求A进行写操作,删除缓存

  1. 请求B进行读操作,读取缓存,未读取到数据

  1. 请求B从数据库读取数据

  1. 请求B保存数据到缓存中

  1. 请求A更新数据库

该更新策略:

  1. 请求B读取的数据为正确数据,此时数据库中数据未更新

  1. 请求A更新数据库成功,缓存中为脏数据。如不设置ttl,则缓存中永远是脏数据

解决办法是采用延时双删策略:

  1. 删除缓存

  1. 更新数据库

  1. 延迟x秒,删除缓存

延迟时间取决于具体业务场景,根据业务写操作时间、主从延时等合理设置。

该场景下写数据库与延迟缓存删除时间间隙,存在读取脏数据情况。

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

缓存更新策略操作1:

  1. 请求A进行写操作,更新数据库

  1. 请求B进行读操作,读取缓存

  1. 请求A删除缓存

该更新策略中请求B读取到脏数据。该情况需要需要在请求A写数据成功与缓存删除时间间隙读取数据,出现概率较小。

暂无较好方法应对,需业务容忍该情况。

缓存设置了ttl。如果没有设置ttl没有该情况。

缓存更新策略操作2:

  1. 缓存ttl到期,缓存失效

  1. 请求B进行读操作,读取缓存,未读取到数据

  1. 请求B从数据库读取数据

  1. 请求A进行写操作,更新数据库

  1. 请求A删除缓存

  1. 请求B保存数据到缓存中

该更新策略数据库数据与缓存中数据不一致,产生脏数据。

产生该情况要求比较苛刻,要求在请求B读数据库与缓存数据时间间隙完成请求A的写数据库与缓存删除操作,正常数据库写操作耗时比读操作大一个数量级,该情况出现概率较小。

但分布式系统环境复杂如网络延时等,业务逻辑特殊如读多列,读大对象都可能导致以上问题。那如何处理呢?与缓存更新策略1相同,采用延时双删策略。

延时双删策略为:

  1. 更新数据库

  1. 删除缓存

  1. 延迟x秒,删除缓存

同样该场景在请求B缓存数据与延迟缓存删除时间间隙,存在脏数据情况。

    • 更新策略共性问题

以上两种更新策略都存在共同的问题,就是最后删除缓存失败如何处理?

  • 更新策略1中,延迟删除缓存失败,则导致缓存脏数据。

  • 更新策略2中,操作1删除缓存与操作2延迟删除缓存失败,同样导致缓存脏数据。

解决方案:

  1. 引入消息中间件,使用消息重试缓存删除。该方案引入了消息中间件,并且同样需要数据一致性问题。

  1. 采用数据库CDC,对应用无侵入,在原有更新策略的基础上多一次删除。对数据准确性要求高的应用可以采用该方案。

数据库与消息中间件的数据一致性是另外一个话题。
    • 两种缓存更新策略对比

我们采用定性分析,分别分析场景出现概率与脏数据持续时间。

  • 先删除缓存后更新数据库,出现概率中,脏数据持续时间中

  • 先更新数据库后删除缓存,出现概率小,装书局持续时间中短

对比结论:缓存更新策略采用先更新数据库后删除缓存。

总结

  1. 缓存更新满足读多写少应用场景

  1. 缓存读取不要求强一致性,但尽可能读取到正确数据,即数据库的最新数据

  1. 缓存更新策略选择 先更新数据库后删除缓存 更能降低读取脏数据的概率

  1. 缓存根据应用场景可设置缓存ttl

  1. 如想进一步提供数据的准确性,可采用 先更新数据后删除缓存 + CDC 延迟删除 策略,此时应用可不做延时删除。

参考

分布式之数据库和缓存双写一致性方案解析

缓存与数据库一致性保证

缓存更新的套路

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

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

相关文章

SwiftUI 文本框TextField添加清除按钮

这里写自定义目录标题前言/背景实现参考前言/背景 使用SwiftUI框架,希望在文本框TextField控件中输入内容后显示一个清除按钮,可以清空内容,像这样: UIKit 框架的 UITextField可以配置clearButtonMode,但是SwiftUI框架里的TextField没有这个&#xff…

javaScript常用语法

一、数据类型1. 原始数据类型(7个)number, string, boolean, undefined, null, symbol, bigint1.1 number包括以下三种浮点和整型数字(如3.1416926和3)NaN(not a number)不是数字infinity超出js数字范围的数值2. 引用数据类型(3个)object, array, function2.1 特殊类型RegExp, …

MySQL Performance Schema知识点

MySQL Performance Schema知识点 程序插桩(instrument)。程序插桩在MySQL代码中插入探测代码,以获取我们想了解的信息。 消费者表(consumer),指的是存储关于程序插桩代码信息的表。如果我们为查询模块添加…

基于Springboot搭建java项目(二十六)——创建Vue前端项目

创建Vue前端项目 一、创建Vue前端项目 1、安装 Vue CLI 1.1、下载Node.js 因为需要使用 npm 安装 Vue CLI,而 npm 是集成在 Node.js 中的,所以第一步我们需要安装 Node.js,访问官网 https://nodejs.org/en/,首页即可下载。 下…

day26|455.分发饼干、376. 摆动序列、53. 最大子序和。进军贪心

455.分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有…

Python | 数据类型之元组和字典

知识目录一、元组(tuple)1.1 元组的创建1.2 访问和修改元组1.3 内置函数二、字典(dict)2.1 字典的创建2.2 访问和修改字典2.3 字典键的特性2.4 函数与方法一、元组(tuple) Python 的元组与列表类似,不同之处在于元组的元素不能修改。 元组使用小括号,列…

kubernetes-dashboard 实现 http 访问以及免 token 登录

文章目录[toc]下载官方 yaml 文件修改 yaml 文件修改 service 端口修改 clusterrolebinding修改 deployment 内容修改探针检测修改镜像拉取策略修改容器端口关闭 token 登录增加 ingress完整版 yaml下载官方 yaml 文件 最后有完整版的 yaml 文件,不想看细节的话&am…

苹果中的这些小技巧,你知道吗

技巧一:iPhone镜像 觉得手机屏幕太小看电影玩游戏不爽怎么办?投屏功能帮我们解决了问题,使用方法也很简单。打开控制中心,点击投屏,选择设备,连接投屏。这里需要注意的是,手机和连接的设备必须在…

【MIKE水动力】MIKE11基本原理(上)

Mike11软件包由水动力、对流~扩散、水质、降雨~径流、洪水预报等模块组成,核心模块为水动力模块。Mike11水动力模块采用6点Abbott~Ionescu有限差分格式对圣维南方程组求解。 一、圣维南方程组 1、基本要素与假设条件 Mike11模型…

开源流程引擎activiti、flowable、camunda选哪个好?

市场上比较有名的开源流程引擎有osworkflow、jbpm、activiti、flowable、camunda。其中:Jbpm4、Activiti、Flowable、camunda四个框架同宗同源,祖先都是Jbpm4,开发者只要用过其中一个框架,基本上就会用其它三个。低代码平台、办公…

IO流概念、FileWriter类及FileReader类详解

目录 IO流概述和分类 ​编辑FileWriter写数据 FileWriter写数据的方法 FileWriter写数据常见问题 FileReader读数据 IO流概述和分类 IO流用来处理设备之间的数据传输–文件复制,上传文件和下载文件 IO流分类–输出流——FileWriter –输入流——FileReader 图式详解&am…

< 每日算法 - Javascript解析: 交通枢纽 >

每日算法 - JavaScript解析:交通枢纽一、任务描述:》 示例一:》示例二二、题意解析拓展知识三、解决方案:往期内容 💨一、任务描述: 为了缓解「力扣嘉年华」期间的人流压力,组委会在活动期间开…

谷歌优化排名怎么做?Google SEO怎么优化?

本文主要分享关于Google自然排名优化中的一些方法和技巧,让你更快的做好谷歌排名。 本文由光算创作,有可能会被修改和剽窃,我们佛系对待这种行为吧。 谷歌优化排名怎么做?Google SEO怎么优化? 答案是:创…

CMOS器件与TTL器件CMOS电平与TTL电平

常用的数字芯片,按制造工艺主要分为TTL器件和CMOS器件。TTL器件是指其内部主要逻辑单元为双极性晶体管,CMOS器件是指其内部的主要逻辑单元为MOS管。现在绝大部分数字芯片使用的工艺都是CMOS工艺,在一些比较老的74系列芯片中还使用的是TTL工艺…

51单片机最强模块化封装(1)

文章目录前言一、sys文件创建和路径添加1.创建文件夹添加文件夹路径二、sys文件编写1.sys.h2.sys.c三、模块化的测试总结前言 今天将为大家讲解51单片机的模块化封装,为什么要讲这个模块化封装呢?模块化封装将提高我们代码的可移植性和可复用性&#xf…

力扣刷题记录——1002. 查找共用字符、905. 按奇偶排序数组、 977. 有序数组的平方

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——1002. 查找共用字符、905. 按奇偶排序数…

服务器被ddos攻击的处置策略

如果您的服务器遭到了DDoS攻击,以下是一些可以采取的措施:使用防火墙和安全组进行限制:限制服务器的流量以防止进一步的攻击。升级服务器资源:为了应对更高的流量,可以升级服务器的内存,处理器等资源。安装…

GraspNet-1Billion

目录 .1 intro .2 Dataset 2.1 data collection: 2.2 data annotation 2.3 evaluation .3 backbone 3.1 Training and Inference 3.2 Experiment References .1 intro contribution: 一个具有统一评价体系的大规模抓取姿态检测数据集 评估系统通过解析计…

顶会论文 | 虚拟网络探测技术的探索与实践

作者:吕彪 阿里云网络齐天负责人 云网络由物理网络和虚拟网络共同组成,两者都会影响网络性能。过去的研究主要集中于解决物理网络探测,而在虚拟网络探测领域的相应研究则较少。本文将为大家分享一种专为大规模多租户虚拟网络设计的主动探测系…

SAP进阶技术分享一:ABAP增强(1)

一:基于源代码的增强 1.定义 源代码增强以子程序形式发布,可以用PERFORM调用这些子程序,发布的时候是空的,提供一个空代码的子过程,用户可以添加自己的代码。 2.特点 需要修改sap的标准代码。   屏幕增强以客户屏幕…