缓存数据一致性策略如何分类?

news2024/11/19 14:34:22

一、概述

数据库与缓存数据一致性问题,一直以来都是大家比较关注的问题。针对一致性的解决方案也是非常多,以下主要针对方案的梳理与分类:

数据库数据与缓存数据一致性的方案,可以从不同的角度来分类,比如:

一致性的强度

可以分为强一致性最终一致性。强一致性要求每次写入操作后,缓存中的数据和数据库中的数据完全一致。最终一致性允许每次写入操作后,缓存中的数据和数据库中的数据存在一定的延迟,但最终会达到一致。

更新缓存的时机

可以分为先更新缓存,后更新数据库先更新数据库,后更新缓存。这两种方案都需要考虑操作失败、并发冲突、数据过期等情况,以及如何处理这些情况。

删除缓存的时机

可以分为先删除缓存,后更新数据库先更新数据库,后删除缓存。这两种方案都可以避免缓存利用率低的问题,但也需要考虑操作失败、并发冲突、缓存重建等情况,以及如何处理这些情况。

保证一致性的手段

可以分为分布式锁消息队列订阅变更日志等。这些手段都是为了解决一些特定的场景或问题,比如减少数据不一致的时间窗口、避免并发导致的数据错乱、提高缓存利用率和并发性等。

二、实现方案分类

其实整个方案的着力点在于一致性,个人感觉可以按一致性的强度来分类:

2.1、最终一致性

1)Cache-Aside Pattern (旁路缓存=更DB、删缓存)

Cache-Aside Pattern,也被称为旁路缓存模式,是一种常见的缓存设计模式,其中缓存的管理由应用程序显式处理。在这种模式下,应用程序负责决定何时读取、写入和使缓存失效,而不是由缓存系统自动处理。

以下是 Cache-Aside 模式的基本工作流程:

读取数据: 当应用程序需要从数据库中获取数据时,它首先检查缓存是否已有。

未命中缓存: 如果缓存中没有,应用程序从数据库中读取数据,并将其放入缓存。

写入数据: 当应用程序对数据进行写入操作时,它首先更新数据库,然后删除缓存。

Cache-Aside 模式的优点包括:

  • 灵活性: 应用程序完全掌握缓存的读取、写入和失效策略,具有灵活性和可定制性。
  • 简单性: 实现相对简单,不需要复杂的缓存管理逻辑。

然而,这种模式也有一些潜在的缺点:

  • 一致性: 如果高并发或应用程序未能正确管理缓存时,可能导致短期数据库与缓存之间的数据不一致。

2)Read/Write-Through Pattern (读写穿透=缓存主)

Read/Write-Through Pattern(读写穿透模式)与 Cache-Aside 模式类似,但在数据的读取和写入方面有一些不同。

  • Cache-Aside 要求应用程序主动管理缓存,读写操作都需要应用程序显式地处理。
  • Read/Write-Through 则是一种更被动的方式,缓存系统自动处理数据的加载和写回,应用程序只需从缓存中读取和写入数据。

Read-Through:

    • 读取数据: 当应用程序需要读取数据时,它首先检查缓存。
    • 未命中缓存: 如果缓存中没有所需数据,应用程序不直接从数据存储中读取数据,它会请求缓存,缓存会在未命中时,自动从数据存储中获取数据,然后将数据写入缓存,并将数据返回给应用程序。
    • 命中缓存: 如果缓存中存在所需数据,应用程序直接从缓存中获取数据。

Write-Through:

    • 写入数据: 当应用程序对数据进行写入操作时,它首先更新缓存,然后再更新底层的数据存储。
    • 保持一致性: 写入操作始终通过缓存,以确保数据在写入到底层存储之前已经存在于缓存中,从而保持数据一致性。
    • 缓存失效: 由于写入操作总是通过缓存进行,可以确保缓存中的数据是最新的。在写入后,缓存中的对应数据可能需要失效,以便下次读取时重新从数据存储加载。

Read/Write-Through 模式的优点包括:

  • 一致性: 通过在写入时通过缓存,可以保持数据的一致性。
  • 简化应用程序逻辑: 应用程序只需关心读写缓存,而不需要关心底层数据存储的具体细节。

但与此同时,这种模式也可能引入一些延迟,另外缓存本身实现。

3)Write-behind Pattern (异步写入=缓存主、DB异步)

Write-Behind Pattern(异步写入模式)与 Cache-Aside 模式和 Read/Write-Through 模式类似,但在写入数据方面有一些不同之处。该模式的主要特点是,写入操作首先更新缓存,然后异步地将数据写回到底层数据存储,而不会阻塞应用程序。

以下是 Write-Behind 模式的基本工作流程:

写入数据: 当应用程序对数据进行写入操作时,它首先更新缓存,然后立即返回成功,而不等待底层数据存储的写入完成。

异步写入: 缓存系统异步地将更新后的数据写回到底层数据存储。这可以通过后台任务、消息队列等异步机制来实现。

Write-Behind 模式的优点包括:

  • 提高写入性能: 应用程序无需等待底层存储的写入操作完成,因此写入操作的性能可能更高。
  • 降低延迟: 应用程序获得写入成功的反馈速度更快,因为不需要等待底层存储的确认。

缺点:

  • 一致性风险: 在异步写入过程中,如果底层存储发生故障或写入失败,可能导致缓存与底层存储的不一致。
  • 难以调试: 异步写入模式可能增加系统的复杂性,特别是在处理一致性和错误情况时。

4)延时双删

  • 先删缓存
  • 再更新DB
  • 延时(保证DB完全被更新)
  • 再次删缓存(第一次删缓存后,在更新DB完成前,这时的线程读取DB数据还是旧的,它放入缓存的数据也是旧的,所以要二次删缓存)

这两次缓存删除操作确保了在写操作期间,即使有其他线程在更新数据库之前读取了旧的数据,延时双删策略也能保证最终缓存中的数据是最新的。这样可以有效地维护数据库和缓存之间的一致性。

2.2、强一致性

1)分布式锁

在分布式系统中,实现数据库与缓存数据的强一致性通常需要使用分布式锁。分布式锁可以确保在任何时候只有一个节点能够对数据进行写操作,从而避免了并发写入导致的一致性问题。实现分布式锁需要谨慎处理,并确保在各种异常情况下都能够保持一致性。此外,分布式锁的性能开销相对较高,因此在设计时需要权衡一致性和性能。

2)分布式事务

分布式事务确保在涉及多个数据存储的复杂操作中,要么所有的操作都成功,要么所有的操作都失败,从而维护数据的一致性。同样分布式事务会引入性能开销,并且一些缓存系统可能并不原生支持分布式事务。在一些情况下,可能需要通过其他手段,例如补偿性操作或定期的一致性检查,来确保数据库与缓存之间的一致性。

三、总结

  • 如果系统或业务相对比较简单,对一致性要求不是太高,可选择先更新DB再删除缓存(青铜方案=旁路缓存)。这也是我们平常用的最多的一种方案。
  • 如果系统或业务相对比较复杂,对一致性要求相对较高,可以选择延时双删(钻石方案=删缓存->更DB->删缓存)。实现有的麻烦,但相对消耗较小。
  • 如果系统或业务很复杂,对一致性要求很高,可以选择加锁或事物控制。可以保证强一致性,但相对消耗就很大。

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

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

相关文章

算法——队列+宽搜(BFS)

队列这种数据结构大都服务于一个算法——宽搜(BFS)。宽搜还可以运用到二叉树、图、迷宫最短路径问题、拓扑排序等等 N叉数的层序遍历 N叉树的层序遍历 题目解析 给定一个 N 叉树,返回其节点值的_层序遍历_。(即从左到右&#…

c语言结构体学习上篇

文章目录 前言一、结构体的声明1,什么叫结构体?2,结构体的类型3,结构体变量的创建和初始化4,结构体的类型5,结构体的初始化 二、结构体的访问1,结构体成员的点操作符访问2,结构体体成员的指针访问 前言 昨…

安卓在SOA中的运用

安卓在运用SOA研发的过程中,会针对实际情况对研发的架构和流程进行优化,通过优化过的架构和实施方案,不仅可以大大提升了整车开发的效率和灵活行以及功能落地的稳定性,同时也增加了系统的向上兼容性。 目前基于车载SOA系统的研发…

在实际电路中的二极管

常见有静电保护用的TVS,电源DC-DC上用的续流二极管,稳压管,发光LED二极管等 本文概要: 0. 二极管识图1. TVS二极管2. 整流二极管3. 稳压二极管4. 肖特基二极管5. 快回复二极管6. 续流二极管7. 发光二极管8. 变容二极管9. 小结一…

QT----Visual Studio添加QT Multimedia报错未找到

问题描述 引入QSound头文件报错,需要添加multimedia模块。项目–QT project settings–QTmodules,添加上multimedia。但是6.4的qt添加完成后全报错了,且6.4已经把sound删了。 问题解决 其实是安装qt的时候没有把Multimedia这个模块装上 打开…

视频融合云平台/智慧监控平台EassyCVR告警警告出错是什么原因?该如何解决?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

基于SSM+Jsp的在线商城系统(有文档演示视频,java毕业设计)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

vue保姆级教程----深入了解Vuex的工作原理

📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 &#x1f4…

HTML----JavaScript操作对象BOM对象

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 本章要求 了解BOM模型掌握BOM模型实际应用 一.BOM模型概述 BOM(浏览器对象模型)是JavaScript中的一个重要概念,它提供了一组用于控制浏览器窗口和页面内容的…

通过IP地址防范钓鱼网站诈骗的有效措施

随着互联网的普及,钓鱼网站诈骗成为一种广泛存在的网络犯罪行为。通过冒充合法网站,攻击者试图窃取用户的敏感信息。本文将探讨如何通过IP地址防范钓鱼网站诈骗,提供一系列有效的措施,以加强网络安全,保护用户免受诈骗…

逻辑回归算法到底能做什么

逻辑回归(Logistic Regression)是一种广义的线性回归分析模型,常用于数据挖掘、疾病自动诊断、经济预测等领域。它根据给定的自变量数据集来估计事件的发生概率。变量的范围在0和1之间,通常用于二分类问题,最终输出的预…

javafx

JavaFX JavaFX简介 JavaFX是一个用于创建富客户端应用程序的图形用户界面(GUI)框架。它是Java平台的一部分,从Java 8开始成为Java的标准库。 JavaFX提供了丰富的图形和多媒体功能,使开发人员能够创建具有吸引力和交互性的应用程…

【Proteus仿真】【Arduino单片机】数控稳压可调电源设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用动态数码管、按键、PCF8591 AD/DAC、LM358放大电路模块等。 主要功能: 系统运行后,系统默认输出直流5V,数…

C#使用 OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率相关方式

C# 去获取电脑相关的基础信息,还是需要借助 外部的库,我这边尝试了自己去实现它 网上有一些信息,但不太完整,都比较零碎,这边尽量将代码完整的去展示出来 OpenHardwareMonitor获取CPU的温度和频率需要管理员权限 在没…

第十二章 需求工程之一图胜千言

需求建模 可视化需求模型能帮助我们识别被遗漏的、不相关的和不一致的需求。数据流图(DFD)流程图,如泳道图状态转换图(STD)和状态表对话图决策表和决策树事件-响应表需求树用例图活动图实体关系图(ERD&…

Win10升级到Win11

Win10升级到Win11 1. 下载PC健康状况检查应用2. 下载Win111. Windows 11 安装助手2. 创建Windows 11 安装3. 下载Windows 11 磁盘映像(ISO) 3. Windows 11 安装助手4. 安装成功 有些小伙伴的诉求是想使用一下当前最火的Win11操作系统怎么样。 这里就来安…

Java基础进阶(学习笔记)

注:本篇的代码和PPT图片来源于黑马程序员,本篇仅为学习笔记 static static 是静态的意思,可以修饰成员变量,也可以修饰成员方法 修饰成员的特点: 被其修饰的成员, 被该类的所有对象所共享 多了一种调用方式, 可以通过…

引导过程与服务控制

一、开机启动的完整过程 bios加电自检测-------mbr------grub----------加载内核文件------------启动第一个进程 简述:加电后bios程序会自检硬件,硬件无故障,会根据第一启动项去找内核,一般来说,第一启动项是硬盘&a…

初学者快速入门学习日语,PDF文档音频教学资料合集

一、资料描述 本套学习资料是很全面的,共有734份文件,包括PDF,PPT,表格,图片,音频等多种格式,可以作为初级日语的学习教材,也是非常适合初学者入门的,可以帮助大家快速的…

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方。这里拿一起讨论,方便比较。 一、深度优先搜索 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法&…