缓存一致性问题的解决策略

news2024/9/28 6:28:18

缓存一致性问题的背景和概念介绍

在一个系统中,我们通常使用数据库来存储数据,以保证数据的持久性。但是,由于数据库的读写速度相对较慢,如果每次请求都直接访问数据库,会降低系统的响应速度。为了提高系统的性能,我们通常会缓存数据库中的数据。在项目中,我们需要同时维护数据库和缓存的数据确保它们是一致的,但在多线程的场景下,会有各种各样的情况导致数据库和缓存不一致的问题。

应用场景和例子

情景一:更新操作先更新数据库,再修改缓存。

&&

情景二:更新操作先修改缓存,再更新数据库。

假设有线程1和线程2,整个程序按照时间顺序执行四步,对于情景一,假设当前数据库和缓存中的数据都是1,第一步线程1把数据库更新为2,此时缓存还没有更新;第二步切换到线程2执行,线程2把数据库更新为3;第三步线程2把缓存修改为3;第四步又切换到线程1执行,线程1执行之前未完成的工作,把缓存修改为2; 此时数据库中的数据为3,而缓存中的数据为2,出现不一致问题,对于情景二同理。

 并且这样会使逻辑变得复杂,在更新的时候首先要判断缓存中是否有对应的数据,如果不存在对应的数据是不能更新的,因为这样会把很多没必要的数据塞到内存中,造成内存浪费,同时还要去保证判断和写操作之间的原子性。同时生成缓存数据的成本可能较高,如果每次更新操作都要去修改缓存的话,对于网红大V的粉丝数,写操作是远远大于读操作的,如果每次粉丝数增加都要去修改缓存,成本就很大了。

所以这里的解决方案是当数据库的数据需要更新时,直接删除缓存。而需要读取数据时,才去更新缓存,这样就引出了情景三和情景四。

情景三:更新操作先删除缓存,再更新数据库。

&&

情景四:更新操作先更新数据库,再删除缓存。

对于这两种情景,我们选择先更新数据库,再删除缓存,原因如下图。结合下图来看文字,注意只有缓存未命中的时候,才会去读数据库更新缓存,否则就直接返回缓存中读到的数据。

假设线程一先删缓存,再更新数据库,在这两个操作之间,线程二去读取数据,因为缓存已经被删了所以缓存未命中,从而去数据库读,但是此时线程一还没有完成更新数据库的操作,所以此时线程二读到的是旧数据,然后它更新了缓存。线程二执行完成后,线程一继续执行,线程一更新数据库,此时就存在了数据不一致问题,当前数据库中的数据是线程一新写的,而缓存中的数据是线程二在之前更新的。那么从现在开始到缓存过期的这段时间,这个数据都是不一致的。

而对于先更新数据库,再删除缓存,如上图,只有当线程二的读取数据操作发生在线程一的写库和删缓存操作之间,此时线程一已经写库完成了,但是线程二读到的是之前的缓存,就存在不一致问题,不过在线程一写库完成,线程一删除缓存这两个操作之间的时间是远小于线程一删除缓存,线程一写库完成这两个操作之前的时间的,所以即使出现缓存不一致的情况,概率也远低于先删除缓存,再更新数据库的情景。

最后解法:更新操作先更新数据库,再删除缓存,并引入延时双删。

不过推进到现在仍然存在缓存不一致的情况,那么就可以引入一种叫做延时双删的策略,具体做法是,在更新数据库后,先删除缓存中的数据,并设置一个短暂的延时。在延时结束后,再次删除缓存中的数据,这样就算另一个线程把读到的旧数据写入缓存中,因为有个二次删除的操作,缓存不一致的时间也会大大降低。

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

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

相关文章

进行模型测量这种量出来坡面的是平面面积还是真实面积?

斜面面积,不是表面积。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 #DasViewer##实景三维##三维重建##三维模型…

产品经理学习-产品运营《什么是SOP》

目录 什么是SOP 如何执行SOP 执行SOP的重点 什么是SOP SOP就是项目流程操作的说明书 日常工作中的例行操作: 例行操作是指,在每一天,针对每一个用户,在每个项目之中,都必须完成的操作,这些必须完成的操…

Java 的静态代理和动态代理

文章目录 1. 代理设计模式1.1 为什么需要代理设计模式1.2 代理设计模式1.2.1 概念1.2.2 名词解释1.2.3 代理开发的核⼼要素 2. 静态代理2.1 编码2.2 静态代理存在的问题 3. 动态代理3.1 Spring动态代理的概念3.2 动态代理细节分析3.3 动态代理的实现3.3.1 JDK 动态代理3.3.2 CG…

apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$@“

[TOC](apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$”) 1、问题描述 apache 启动报错 apachectl: line 79: 20233 Segmentation fault (core dumped) $HTTPD “$” 2、问题分析 参考链接: https://stackoverflow.com/questions/43726930/apache…

我的服务器为什么会被攻击?

时常的网站运行中,很多站长可能会遇到网站被黑客攻击的情况,其中同行之间恶性竞争,不正当的竞争关系,导致互联网关系越来越差,攻击的方式多种多样,网站遭受攻击的频次也越来越高。其次,就网络黑…

CUDA编程 - 用向量化访存优化 elementwise 核函数 - 学习记录

Cuda elementwise 一、简介1.1、ElementWise1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.2、Cuda elementwise - Add2.3、Cuda elementwise - Sigmoid2.3.1、简单的 Sigmoid 函数2.3.2、ElementWise Sigmoid float4(向量化访存) 2.4、C…

Facebook与社交创新:数字时代的社交构建者

在当今数字化时代,社交媒体已经成为人们日常生活中不可或缺的一部分。而在这个庞大的社交网络中,Facebook作为其中的巨头之一,不仅扮演着连接人们的桥梁,更是社交创新的领导者和推动者。本文将探讨Facebook在数字时代的社交构建中…

算法打卡day3|链表篇|Leetcode 203.移除链表元素、 707.设计链表 、 206.反转链表

链表基本概念 定义 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。其…

leetcode.无重复字符的最长字串(刷题日记)

自从刷题开始之后,就突然有种感觉。 就是在刷完题之后当时是知道方法了,但是当再次遇到知道就又不会做了,就只好打开解题观摩大佬的代码,你别说,每次都感觉自己是s13。 所以我就想通过写博客来总结一下每次做完新的题…

十一、计算机视觉-膨胀操作

文章目录 前言一、什么是膨胀二、膨胀操作的实现1.引入库 三、膨胀的原理 前言 上节我们学习了腐蚀操作,本节我们讲一下膨胀操作,膨胀和腐蚀实际上是相反的操作。上节我们把云峰这2个字周围没用的像素去掉了,但是云峰这2个字也变细了&#x…

C#,弗洛伊德-瑞文斯特(Floyd-Rivest)算法与源代码

Robert W. Floyd 1 Floyd-Rivest 算法 Floyd-Rivest 算法是一种选择算法,用于在不同元素的数组中找到第k个最小元素。它类似于快速选择算法,但在实际运行中有更好的运行时间。 和 QuickSelect 一样,该算法基于分区的思想工作。对数组进行分…

SINAMICS V90 指导手册 第2章 2.2_系统配套表

V90 PN配套表一共有三张,分别是200V低惯量配套表、400V高惯量配套表和400V带直型连接器的配套表。其中200V电压等级低惯量伺服功率范围从0.05-2kW,额定扭矩从0.16-6.37Nm,电缆长度分别是3m、5m、10m、20m四种型号;400V电压等级带直…

《数据治理简易速速上手小册》第4章 数据安全与合规性(2024 最新版)

文章目录 4.1 数据安全的基本原则4.1.1 基础知识4.1.2 重点案例:在线零售商的数据加密4.1.3 拓展案例 1:医疗机构的访问控制4.1.4 拓展案例 2:金融服务提供商的数据备份和恢复 4.2 遵循数据合规性的策略4.2.1 基础知识4.2.2 重点案例&#xf…

如何在项目中考虑非功能需求

软件的非功能需求指的是除了软件的功能需求以外,软件需要满足的一些其他需求。常见的非功能需求包括: 性能需求:软件需要在特定的时间内完成特定的任务,例如响应时间、吞吐量等。可靠性需求:软件需要在各种环境下都能…

MySQL基础(二)

文章目录 MySQL基础(二)1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…

电机应用中的大功率电阻器?

在这篇文章中,我们将考虑电机应用中的电阻器。 交流、直流和专用电机用于广泛的应用。一些电机应用相对简单,唯一需要关注的是电机的启动和关闭。在这里,成本、简单性和可靠性是主要问题,而电机控制电阻器是常见的解决方案。 在…

水印相机小程序源码

水印相机前端源码,本程序无需后端,前端直接导入即可,没有添加流量主功能,大家开通后自行添加 源码搜索:源码软件库 注意小程序后台的隐私权限设置,前端需要授权才可使用 真实时间地址拍照记录&#xff0c…

多线程系列(九) -ReentrantLock常用方法详解

一、简介 在上一篇文章中,我们介绍了ReentrantLock类的一些基本用法,今天我们重点来介绍一下ReentrantLock其它的常用方法,以便对ReentrantLock类的使用有更深入的理解。 二、常用方法介绍 2.1、构造方法 ReentrantLock类有两个构造方法&…

(undone) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵

参考视频1:https://www.bilibili.com/video/BV1H64y1T7zQ/?spm_id_from333.337.search-card.all.click 参考视频2(正定矩阵):https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_…

.NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】

设计模式是软件工程中常用的解决特定问题的通用设计方法。它们提供了经过验证的解决方案,可用于解决在软件开发过程中经常遇到的一些常见问题。设计模式不是一种具体的编程语言特性或语法,而是一种通用的设计思想或模板,可以帮助开发人员设计…