缓存更新的四种策略及选取建议

news2024/10/7 14:30:15

文章目录

  • 缓存更新的四种策略及选取建议
    • 前言
    • Cache Aside
      • Cache Aside查询策略
      • Cache Aside更新策略
      • 延迟双删
    • Read/Write Through
      • Read/Write Through查询策略
      • Read/Write Through更新策略
    • Write Behind
    • Refresh-Ahead
      • CDC
    • 四种策略的选择
      • 性能
      • 数据一致性
      • 冗余数据
      • 代码复杂度
      • 业务逻辑
      • 可靠性
  • 系列文章目录


缓存更新的四种策略及选取建议

前言

缓存更新是指在数据发生变化时,保持缓存和数据库的数据一致性的问题。如果缓存和数据库的数据不一致,会导致用户看到过期或者错误的数据,影响业务逻辑和用户体验。

为了实现缓存更新,我们可以采用以下四种方式:

  • Cache Aside策略:应用程序直接与数据库和缓存交互,并负责维护缓存的一致性

    • 查询:先查询缓存,如果缓存中没有,则查询数据库,并将结果写入缓存
    • 更新:先更新数据库,然后删除缓存或者更新缓存
  • Read/Write Through策略:应用程序只和缓存交互,而是使用缓存与数据库交互

    • 查询:先查询缓存,如果缓存中没有,则缓存从数据库中加载数据,并写入缓存
    • 更新:先更新缓存,再由缓存同步更新数据库
  • Write Behind 策略:应用程序只和缓存交互。当有数据更新时,只更新缓存,不直接更新数据库,改为异步的方式更新数据库

  • Refresh-Ahead策略:应用程序只和缓存交互,由后台服务与数据库交互

    • 查询:只查询缓存
    • 更新:由后台服务自动从数据库中查询最新的数据,并将数据写入缓存中,

    不同于以上三种,应用程序无需等待数据的刷新,也无需自己去触发数据的刷新,而是后台服务来完成这些操作

Cache Aside

Cache Aside策略上文已经介绍过了,它是通过应用层面来实现的,分为两种场景:

  • Cache Aside查询策略
  • Cache Aside更新策略

Cache Aside查询策略

如下图所示:通过代码查询缓存,缓存命中则返回,如果没有命中则查询数据库并设置值

请添加图片描述

Cache Aside更新策略

如下图所示:通过代码更新缓存,先更新数据库,后更新缓存

请添加图片描述

这种策略简单易用,但是需要维护缓存和数据库的一致性,可能出现缓存穿透或缓存雪崩的问题,一般采用延迟双删来保证最终一致性

延迟双删

延迟双删是一种保证数据一致性的常用策略,它的基本思想是在更新数据库后,先删除缓存,然后等待一段时间,再次删除缓存。这样做的目的是为了防止在数据库和缓存主从同步的过程中,有其他请求查询到旧的缓存数据,并写回到缓存中,具体的流程如下:

  1. 更新数据库数据
  2. 删除缓存数据
  3. 休眠一段时间,时间依据数据的读取耗费的时间而定。
  4. 再次删除缓存数据

延迟双删的休眠时间是根据业务读取数据平均耗时来设置的,目的是确保读请求可以结束,写请求可以删除读请求造成的脏数据的问题。一般来说,休眠时间可以设置为500毫秒左右,但具体还要根据实际情况调整。休眠时间设置过长会影响性能和实时性,设置过短会导致数据不一致的风险。

延迟双删的优点是简单易实现,能够提高数据的最终一致性。但是延迟双删的缺点也非常明显:

  • 延迟双删不是强一致性,有等待环节,如果系统要求低延时,这种场景就不合适了
  • 延迟双删不适合“秒杀”这种频繁修改数据和要求数据强一致的场景
  • 延迟双删的延时时间是一个预估值,不能确保数据库和redis在这个时间段内都实时同步或持久化成功了
  • 延迟双删不能完全避免redis存在脏数据的问题,只能减轻这个问题,要想彻底解决,还需要用到同步锁解决

Read/Write Through

Read/Write Through只与缓存做交互,分为两种场景:

  • Read/Write Through查询策略
  • Read/Write Through更新策略

Read/Write Through查询策略

如下图所示:先查询缓存,如果缓存没有,由缓存去数据库查询,而不是应用层,查询后更新缓存

请添加图片描述

Read/Write Through更新策略

如下图所示:先更新缓存,再由缓存同步更新数据库

请添加图片描述

Write Behind

Write Behind 策略是指在写入数据时,只更新缓存中的数据,然后建立一个异步任务或者定时任务来批量更新数据库中的数据。这样,应用程序无需等待数据库的响应,也无需自己去同步更新数据库和缓存,而是交由缓存服务来完成这些操作,如下图所示:

请添加图片描述

Refresh-Ahead

是指在读取数据时,如果缓存中的数据即将过期,则由后台线程或服务自动从数据库中查询最新的数据,并将数据写入缓存中,然后返回给应用程序。不同于以上三种,应用程序无需等待数据的刷新,也无需自己去触发数据的刷新,而是交由后台线程或服务来完成这些操作。其中后台线程或服务的实现通常是使用CDC模式去实现的

Refresh-Ahead 模式的工作原理如下:

  • 当客户端访问缓存中的某个数据时,首先检查该数据是否即将过期,如果是,则启动一个后台线程或服务去从数据库中获取最新的数据,并替换掉缓存中的旧数据;同时返回给客户端
  • 如果该数据还没有即将过期,则直接返回给客户端
  • 如果该数据项已经过期,则从数据库中获取最新的数据,并替换掉缓存中的旧数据,并返回给客户端新数据

CDC

CDC,全称为Change Data Capture。它是一种软件设计模式,通过监测数据变更(新增、修改、删除等)而对变更的数据进行进一步处理的一种设计模式。CDC 可以帮助实现数据同步、数据仓库加载、数据分析等场景

请添加图片描述

CDC 的优点:

  • 提高数据访问的性能和效率,因为它避免了重复地查询整个数据集,而只需要获取增量数据
  • 提高数据一致性和可靠性,因为它可以及时地将数据源的变化同步到下游系统,避免了数据过期或丢失的风险
  • 提高数据分析和洞察的能力,因为它可以实时地反映数据的状态
  • 提高数据集成和转换的灵活性和可扩展性,因为它可以适应不同类型和结构的数据源和目标,支持多种场景和用例。

CDC 的应用场景:

  • 数据同步:可将数据源中的变化同步到其他数据库或数据存储中,例如缓存、搜索索引、备份等。
  • 数据仓库加载:可将数据源中的变化加载到数据仓库或数据湖中,支持离线或实时的数据分析和报告。
  • 数据分析:可将数据源中的变化发送到流式处理平台或机器学习平台中,支持实时或批量的数据处理和建模
  • 数据触发:可将数据源中的变化作为触发器,激活其他系统或服务中的业务流程或逻辑,例如通知、审计、验证等

CDC 的实现方式有多种,其中比较成熟的开源项目就是Debezium。它为CDC提供了一套低延迟的数据流平台支持多种数据库。例如:MongoDB、MySQL、PostgreSQL、SQL Server、Oracle等等。使用Debezium监控数据源,并使用Kafka作为消息服务,将数据源的变化作为事件发送到缓存。这样,缓存可以异步地接收和处理数据变化,而不需要定期地查询数据源

请添加图片描述

四种策略的选择

我们介绍了四种常见的缓存更新策略:Cache AsideRead/Write ThroughWrite Behind CachingRefresh-Ahead。在实际应用时,应该结合具体业务和应用场景来选择合适的缓存策略,接下来我们通过对比性能、数据一致性、冗余数据、代码复杂度、业务逻辑、可靠性这几个点来说明:

策略性能一致性冗余数据代码复杂度业务逻辑可靠性
Cache Aside较高较低较少较高较复杂较低
Read/Write Through较低最高较多最高最简单最高
Write Behind Caching最高最低较少较低较简单较高
Refresh-Ahead次高次高较多最高较复杂最高

注意:
Refresh-Ahead策略是假定无CDC的情况下进行对比的

性能

  • Cache Aside 的性能较高,它只在缓存未命中时才访问数据库
  • Read/Write Through 的性能较低,它在每次读写时都需要访问数据库
  • Write Behind Caching 的性能最高,它只在缓存未命中时才访问数据库,而写入操作是异步的
  • Refresh-Ahead 的性能介于 Cache AsideWrite Behind Caching 之间,它只在即将过期时才访问数据库,并且写入操作也是异步的

数据一致性

  • Cache Aside 的数据一致性较低,它只在缓存未命中时才更新缓存,而写入操作则是直接更新数据库并将缓存中的数据删除或更新
  • Read/Write Through 的数据一致性最高,它在每次读写时都更新数据库和缓存
  • Write Behind Caching 的数据一致性最低,它只在缓存未命中时才更新缓存,而写入操作则是先更新缓存,并在异步更新数据库,有较大的延迟。
  • Refresh-Ahead 的数据一致性介于 Read/Write ThroughCache Aside 之间,它保证了缓存中的数据总是最新的,但是有一定的延迟

冗余数据

  • Cache Aside 的冗余数据较少,它只将经常访问的数据保存到缓存中
  • Read/Write Through 的冗余数据较多,它需要将数据库的所有数据都保存到缓存中
  • Write Behind Caching 的冗余数据与 Cache Aside 相同,因为它也只将经常访问的数据保存到缓存中
  • Refresh-Ahead 的冗余数据与 Read/Write Through 相同,它也需要将数据库的所有数据都保存到缓存中

代码复杂度

  • Cache Aside 的代码复杂度较高,它需要同时与缓存和数据库交互,并处理可能出现的异常情况
  • Read/Write Through 的代码复杂度最高,它需要实现数据库的读写接口
  • Write Behind Caching 的代码复杂度较低,它只需要实现简单的缓存操作,并在异步执行数据库写入操作
  • Refresh-Ahead 的代码复杂度与 Read/Write Through 相同,他它需要实现数据库的读写接口(关于这点可以使用Debezium)

业务逻辑

  • Cache Aside 的业务逻辑较复杂,它需要同时与缓存和数据库交互,且返回的数据是最新的
  • Read/Write Through 的业务逻辑最简单,它只与缓存交互,且返回的数据是最新的
  • Write Behind Caching 的业务逻辑较简单,它也只与缓存交互,且返回的数据是最新的,由于是异步更新,所以比Read/Write Through要复杂一些
  • Refresh-Ahead 的业务逻辑较复杂,它会同时与缓存和数据库交互,需要处理可能出现的异常情况,且返回的数据有可能是旧的,也有可能是新的(关于这点也可以使用Debezium)

可靠性

  • Cache Aside 的可靠性较低,因为它将缓存作为数据库的辅助层
  • Read/Write Through 的可靠性最高,因为它将缓存作为数据库的代理层
  • Write Behind Caching 的可靠性较高,因为它将缓存作为数据库前置层
  • Refresh-Ahead 的可靠性与 Read/Write Through 相同,因为它也将缓存作为数据库的代理层

系列文章目录

Redis内存优化——String类型介绍及底层原理详解
Redis内存优化——Hash类型介绍及底层原理详解
Redis内存优化——List类型介绍及底层原理详解
Redis内存优化——Set类型介绍及底层原理详解
Redis内存优化——ZSet类型介绍及底层原理详解
Redis内存优化——Stream类型介绍及底层原理详解
Redis内存优化——Hyperloglog、GEO、Bitmap、Bitfield类型详解
Redis的三种持久化策略及选取建议
缓存更新的四种策略及选取建议

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

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

相关文章

高精度倾角传感器测量原理

高精度倾角传感器测量原理技术参数 1.性能参数 测量范围:0~30 测量精度:0.06 分 辨 率:0.0001 测量方向:X,Y 时间漂移:0.08/月 更新时间:30ms 上电启动时间:0.5s 2.电…

全网首发 | 广州虚拟动力最新版兼具动捕与面捕功能的动作捕捉系统

随着多项政策明确提出 未来将大力推进虚拟现实与文娱互动 影视艺术等新兴前沿领域的创新与产业化 动作捕捉作为联结虚实世界的桥梁 影响着3D动画以及文娱互动产业的数字化发展 行业痛点 •光学动捕系统成本昂贵:难以下沉到项目预算和运营预算,不利于…

CentOS 安装配置 vncserver

1. VNC 简介 VNC(Virtual Network Computing) 是使用网络建立连接的一个虚拟桌面,用来远程操作计算机的一种技术,日常会有很多中场景需要远程来控制和操作服务器等计算机。 2. CentOS 安装 VNC Server 使用 yum 安装 tigervnc-server。 sudo yum ins…

PG案例系列1:优化大表的count(*)

文章目录 一. 问题描述二. 解决方案2.1 收集统计信息2.2 并行2.3 autovacuum2.3 统计信息读取 参考: 一. 问题描述 前端页面需要分页展示,经常需要查询总数,然后做分页展示。 遇到的问题是,第一次执行会很慢,6秒左右&#xff0c…

C++数据结构:二叉树之一(数组存储)

文章目录 前言一、二叉树的基本定义二、二叉树的基本性质三、二叉树的存储(数组)总结原创文章,未经许可,禁止转载 前言 树是一种非线性数据结构,它由若干个节点和边组成。每个节点都有一个值,而边则表示节…

2核4G5M性能测评:腾讯云轻量应用服务器CPU内存带宽系统盘

腾讯云轻量应用服务器2核4G5M配置一年168元,三年628元,100%CPU性能,5M带宽下载速度640KB/秒,60GB SSD系统盘,月流量500GB,折合每天16.6GB流量,超出月流量包的流量按照0.8元每GB的支付流量费&…

SuperMap iDesktopX扩展开发之GP算子扩展

作者:dongyx SuperMap iDesktopX是超图研究院推出的一款跨平台的桌面GIS软件,兼容Windows和Linux,同时iDesktopX也采用的是插件式扩展开发框架,支持定制开发。 使用iDesktopX定制开发有以下优势: ⚫ 采用 Swing 图形界…

第五十八天学习记录:C语言进阶:文件操作1

什么是文件 在程序设计中,一般有两种文件:程序文件、数据文件 程序文件 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.e…

TM7707 评估前做的功课

目录 硬件 模拟输入范围 转换速度与有效位数 数字电平匹配 建立时间 基准电压 软件 寄存器 硬件 MCU 3.3V 平台; ADC mclk 2.4576mhz 模拟输入范围 在非缓冲模式下,共模输入范围是从 GND 到 V DD 。模拟输入电压的绝对值处在 GND-30mV 和 …

SAP不停机做client copy ,把800数据覆盖到600,导致在600很多单据创建不出来

不停机做client copy ,把800数据覆盖到600,但是因为没有停机,导致在800还在产生单据,以至于600的 number range 不对,很多单据都能保存成功但是查寻不到 涉及到的单据(包括但不限于) 采购订单 生…

GPT-4 太贵?试试这 6 个免费且优秀的替代方案

大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、读书和自媒体。 目录 AutoGPT - 直接从您的浏览器使用 Bard - Google AI 的免费工具。 Bing - New Bing 已经支持GPT-4, Claude - Anthropic对标ChatGPT Hugging…

适合每个人的热门CSS工具

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一时间和你分享前端行业趋势,学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,包含一线大厂面试完整考点、资料以及我的…

Jenkins+Gogs自动远程Docker环境部署django项目

1.Jenkins安装或确认必要插件 jenkins安装或确认必要插件gitlab、Publish Over SSH。 Dashboard--Manage Jenkins--Plugin Manager 2.Publish Over SSH配置 jenkins配置SSH连接django服务部署的对象服务器 Dashboard--Manage Jenkins--Configure System,找到 Publ…

LIS和LIMS有什么区别?

术语“实验室信息系统”(LIS)和“实验室信息管理系统”(LIMS)经常会引起混淆,并且倾向于互换使用这些术语。通常,术语“ LIS”是指用于管理医院或医疗环境中的临床诊断测试的系统。另一方面,LIM…

基于C#的串口扫描枪通信实战

今天搞大事,观众们动起来,搞事的目的是 掌握串口通信及winform开发技术 硬件设备:1、串口激光扫描枪,注意是串口,不是USB口 2、USB转串口的连接线一根,如图连接所示 3、USB扩展器一个,如果你电…

图片优化: CssSprites与Base64编码

文章目录 1 css sprites1.1 CSS Sprites是什么1.2 为什么需要css sprites1.3 优势1.4 使用原理 2 图片Base64编码 1 css sprites 1.1 CSS Sprites是什么 CSS Sprites是一种网页图片应用处理方式。 又被解释为: CSS精灵CSS图像拼合CSS贴图定位CSS图片精灵CSS雪碧图…

快六一啦,学习CSS3实现一个冰淇淋动画特效

快六一啦,小时候顶多吃个小冰棍,或者是那种小冰袋,现在的小朋友真是好,动不动就能吃到冰淇淋,今天用CSS3实现一个冰淇淋的动画特效吧 目录 实现思路 桶身的实现 冰淇淋身体的实现 五彩颗粒的实现 HTML源码 CSS3源…

17 张程序员专属壁纸推荐

1、三思后再写代码!!! 2、从世界上搜索喜欢你的人!!! 3、代码没写完,哪里有脸睡觉!!! 4、程序员的 Home 键!!! 5、编程是…

【完整项目开发】Springboot+vue教学材料管理系统定制开发

Springbootvue 的专业建建设材料管理系统。 **大家好,今天分享最近做的一套系统。**起因源于小伙伴的需求 文末有的获取方式,如需定制系统,需求发来,我为你分忧,搞起 一、 项目介绍 基于各个专业,对教…

代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇

代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇 583. 两个字符串的删除操作解法一:动态规划解法二:计算最长公共子序列,然后用数组长度减掉子序列长度 72. 编辑距离解法一&#…