缓存一致性解决方案

news2024/12/26 20:57:46

文章目录

    • 常见的缓存一致性解决方案
    • 双写模式
    • 失效模式
    • 两种模式的总结
    • 上述模式的改进

常见的缓存一致性解决方案

这里的缓存一致性其实就是缓存中的数据和数据库中的数据如何保持一致.
   这个问题根据具体的业务场景和需要解决起来略有差异,但是总体看以分为两类,双写模式和失效模式,那他们是怎样工作的呢?有什么缺点以及怎样进行改进呢? 这里总结说明一下.

双写模式

总的流程就是先写数据库,数据库写成功了,去更新缓存.

在这里插入图片描述
在大并发下可能会产生的问题:
   有两个更新请求, 请求1先去写数据库,写完数据库再写缓存的时候因为卡段等某些原因,导致请求2优先完成了另一个写数据库,写缓存的操作,这时候请求1再去写缓存,缓存里的数据就和数据库中的数据不一致了.
在这里插入图片描述

失效模式

总体流程:
   更新的时候先更新数据库,然后直接删除缓存,等后面有查询操作的时候,会自动将最新数据放到缓存中
注意:
    在将数据库里的数据查出来放入到缓存中时,首先要判断缓存中是否有,如果有的话,说明在这个期间有别的请求对缓存做了操作,此时就不应该再去处理了.否则很容易造成不一致问题.
在这里插入图片描述
并发下存在的问题:
   假如某一条数据因为过期或者被删除了,在缓存中并没有.
   此时有两个请求,请求2先去读缓存,缓存中没有,然后去数据库中查询出来,在准备去更新缓存的时候,因为gc或者cpu切换等原因,请求1先完成了更新数据库删除缓存的操作,这个时候请求2将查询出来的数据放入缓存.缓存里面的数据就变成了一个旧数据.

在这里插入图片描述

两种模式的总结

保持数据一致性的解决方案:
上述两种模式在大并发下都会产生数据不一致情况,其实解决方案也趋于一致.主要就是两种

  1. 加锁,上述问题产生的根本原因是写数据库,更新缓存的操作不是一个整体,不是原子性的,那我们可以通过加锁,将其变成一个整体.
    那加锁又有不同的方式,如果是读多写少的情况,可以加分布式读写锁,来规避读读之间的互斥,提高并发量,如果是写多读少的情况,说实话本身就没有必要放到缓存中了.
  2. 加过期时间,如果我们的业务允许可以有短暂性的不一致的话,这种场景都不用再纠结了.直接加一个短暂的过期时间就好了, 比如说一天,当数据过期后,又会从数据库加载最新的数据.

主要区别:

   这两种模式最主要的区别在于一个是更新缓存,一个是删除缓存,那要怎样选择呢?

   最主要的区分点在于这个数据会不会被频繁的访问到?

   一般来讲,访问数据也遵循28法则,即20%的数据占据了80%的访问量,那如果这个数据需要被非常频繁的访问到,并且不涉及到什么复杂计算,那应该更新缓存, 否则则应该采用更简单的删除缓存.

上述模式的改进

   上面两种模式及解决方案可能还是会存在一些小问题,比如说加锁肯定会影响性能,那还有一种更好的方式,只是复杂度会高一些.
   上述产生并发问题的最关键一点就是最新的数据没有更新到redis中,那我们可以使用阿里开源的canal,它其实是将自己伪装成mysql的从服务器,通过监听变更日志(binlog)的方式,将数据库的更新按序同步到redis中.
   这种方式的另一个好处就是在编码期间只需要更新数据库,都不需要去更新缓存,
在这里插入图片描述

今天的分享就到这里了,有问题可以在评论区留言,均会及时回复呀.
我是bling,未来不会太差,只要我们不要太懒就行, 咱们下期见.
在这里插入图片描述

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

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

相关文章

C-Frost安装及Cassie计算样例

本文运行环境为:Matlab2021b/Mathematic 13/Ubuntu18.04 matlab安装mathematic安装 一、 C-Frost安装 1、安装ipopt 安装参考 2、执行NLP例子验证是否安装成功 官方步骤 1)修改create_problem.m文件中的 FROST_PATH路径 2)修改CMakeL…

写代码时记录的小技巧

本文是记录自己写代码时候遇到的一些感觉比较有用/有意思的技巧,怕自己忘了记录一下。如果有想要分享的思路/纠正改进的地方欢迎交流。 如何输出结果 (Verbose Trick) 有关类的输出 1. 如果想在**模型的 forward 中输出相关变量**,但又不希望反复输出影…

Oracle如何删除归档日志文件?

Oracle如何删除归档日志文件? Oracle启用归档日志的状态下,会在指定的归档日志目录生成大量的日志文件,而且这些日志文件默认是不会定期清理。长时间运行下,会占用大量的存储空间,最终可能导致Oracle没有足够的空间维持…

Linux集成环境部署tomcat+Linux

Linux环境部署 tomcat redisTomcat 安装配置Redis安装配置Tomcat 安装配置 下载tomcat安装包,将安装包上传至自己的linux服务器中,将安装包传到linxu环境中的/usr/local/tomcat下,使用tar -xvf 命令解压 2. 进入到bin目录下,给所…

Allegro如何查找和高亮PAD Stack类型操作指导

Allegro如何查找和高亮PAD Stack类型操作指导 Allegro可以在板子上查找并且高亮PAD的类型,查找的范围包括器件的pad,以及过孔的pad,具体操作如下 用Allegro的was performance L模式下,并且勾选Allegro Productivity Toolbox选项 选择Tools-padstack finder 会出现padsta…

数字图像处理 - 图像采样和量化

1、 目标 获取图像的方法有很多种,但最终的目标是一致的:从传感数据生成数字图像。大多数传感器的输出是连续的电压波形,其幅度和空间行为与被感测的物理现象有关。要创建数字图像,我们需要将连续感测数据转换为数字格式。这就需要…

扩散模型的源码学习diffusion_model

1.diffusion_model有几个主要的部分, (1)Unet,主干网络。 (2)GaussianDiffusion,也就是主要的训练策略。 2. 生成一个测试用的tensor来进行实验。 3.进入到高斯模型的内部,发现…

(六) Redis缓存读写策略

一 引言 缓存的引入后极大的提高了服务器的访问速率,但是当持久化数据发生变化时,如何更新缓存成为了研发中不可规避的问题,不同的方案决定缓存的最终的一致性,本文就redis的缓存读写策略,以及其他的缓存读写策略做简要概述 二 Cache Aside Pattern(旁路缓存模式&…

Vue学习:键盘事件

input表单占位符-显示输入先的提示文本-placeholder属性 键盘事件keydown——按下 不需要松手 keyup&#xff1a;按下松手 根据按键编码进行判断 --输出event上有一个属性-keyCode -按键编码--回车13 <!-- 准备容器 --><div idroot> <input type"text&quo…

Docker安装和使用

一&#xff1a;docker安装 链接: https://pan.baidu.com/s/1A1g7rSOMoV4__Me_zJoB3Q?pwd6bqi 提取码: 6bqi 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享。 二&#xff1a;docker使用 1.docker和虚拟机的区别&#xff1a; …

Word文档如何设置成不可编辑的模式?

把Word文档设置成“不可编辑模式”&#xff0c;也就是“限制编辑”&#xff0c;可以防止意外更改文档内容&#xff1b;对于只想给他人读阅&#xff0c;禁止复制和更改的情况&#xff0c;也能起到一定的保护作用。 Word文档里自带设置限制保护的选项&#xff0c;在菜单中选择【…

【Uni-App】uniapp使用uview实现弹出键盘输入密码/验证码功能

目录&#xff08;一&#xff09;效果图&#xff08;二&#xff09;使用组件说明keyboard属性&#xff1a;keyboard事件&#xff1a;&#xff08;五&#xff09;js代码实现&#xff08;一&#xff09;效果图 &#xff08;二&#xff09;使用组件说明 组件使用的是uview组件&…

MATLB|多微电网及分布式能源交易

目录 一、概述 二、数学模型 三、结果可视化 四、Matlab代码实现 一、概述 在人类、工业和电动汽车的能源需求的推动下&#xff0c;全球能源需求预计将在未来几年稳步增长&#xff1b;更准确地说&#xff0c;预计到 2030 年增长将达到 40%。这种需求是由人类日益依赖能源的…

Linux配置网络,增添网络会话,Wget下载,yum仓库配置

配置网络 从RHEL7开始引入了一种新的“一致网络设备命名”的方式为网络接口命名&#xff0c;该方式可以根据固件、设备 拓扑、设备类型和位置信息分配固定的名字。网络接口的名称的前两个字符为网络类型符号。如: en——表示以太网(Ethernet)、wl表示无线局域网(wlan)、ww表示无…

[附源码]Python计算机毕业设计SSM基于的高校在线办公系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【玩转ChatGPT |OpenAI超级对话模型】手把手带你玩转ChatGPT

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

【深度学习】PyTorch深度学习实践 - Lecture_10_Basic_CNN

文章目录一、CNN基础流程图二、CNN的两个阶段三、卷积的基本知识3.1 单信道的卷积3.2 三信道的卷积3.3 N信道卷积3.4 输入N信道-输出M信道卷积3.5 卷积层的常见参数3.5.1 Padding3.5.2 Stride3.5.3 下采样&#xff08;MaxPooling&#xff09;四、实现一个简单的CNN4.1 网络结构…

【案例教程】气象数值预报WRF-DA资料同化系统理论、运行与变分、混合同化新方法技术

【视频教程】WRF DA资料同化系统理论、运行与与变分、混合同化新方法技术应用https://mp.weixin.qq.com/s?__bizMzAxNzcxMzc5MQ&mid2247518760&idx1&snddbc45296acc595402434b88bc179a27&chksm9be39538ac941c2eabab2492e997827d0e1269de3b229fadee72f1223bbcd…

机器学习实战教程(三):决策树实战篇

一、前言 上篇文章机器学习实战教程&#xff08;二&#xff09;&#xff1a;决策树基础篇之让我们从相亲说起机器学习实战教程&#xff08;二&#xff09;&#xff1a;决策树基础篇_M_Q_T的博客-CSDN博客机器学习实战教程&#xff08;二&#xff09;&#xff1a;决策树基础篇之…

web前端期末大作业 html+css+javascript汽车销售网站 学生网页设计实例 企业网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…