缓存数据库一致性问题

news2024/11/19 19:24:31

为什么使用缓存?

  1. 业务处于起步阶段,流量非常小,那无论是读请求还是写请求,直接操作数据库
  2. 随着业务指数级增长,请求量剧增,直接访问数据库,导致性能急剧下降,需要引入缓存提高读性能。
    在这里插入图片描述

引入缓存导致的一些问题?

1、如何将数据库的数据加载到缓存中?
  • 系统启动或者业务执行前,统一将数据刷入缓存
  • 写操作时变更数据库,不操作缓存
  • 启动定时任务,定时将数据库数据更新到缓存中

在这里插入图片描述

  • 优点
    • 所有的缓存都可以直接命中,不需要查数据库,性能特别高
  • 缺点:
    • 缓存利用率低:写多读少的场景特别明显,不经常访问数据也在缓存中
    • 数据不一致:定时刷新缓存,数据不一致的程度完全取决于定时任务的执行频率
  • 适用场景
    • 业务体量小,数据库一致性要求不高的业务场景。
读操作时写缓存
  • 写操作时,写数据库
  • 读操作时,先读缓存,缓存不存在时读库写缓存(缓存只保留访问的热数据)
  • 写入缓存的同时写入失效时间
    在这里插入图片描述
  • 先更新缓存,再更新数据库
    • 两个步骤不同步导致的问题
      在这里插入图片描述
    • 并发问题
      在这里插入图片描述
  • 先更新数据库,再更新缓存
    • 两个步骤不一致导致的问题
      在这里插入图片描述
    • 并发问题
      在这里插入图片描述

无论先更新缓存,还是先更新数据库,这种更新操作都会存在数据不一致和并发问题,不仅缓存利用率不高,还会造成机器性能的浪费,所以,可以采用删除缓存的策略

  • 先删除缓存,再更新数据库
    • 删除更新步骤不一致的问题
      在这里插入图片描述

虽然不存在缓存不一致的情况,但是有缓存击穿的风险,可以加锁将读取数据库,写缓存的两个逻辑合并为原子操作。

- 并发问题

在这里插入图片描述

先删除缓存再更新数据库,读写并发时,存在数据库缓存不一致的问题。

  • 先更新数据库,再删除缓存
    • 删除更新步骤不一致的问题
      在这里插入图片描述

更新完数据库,删除缓存失败之后,导致数据缓存不一致问题

  • 并发问题
    在这里插入图片描述

看似理论上会发生的事情,其实概率极低,先更新数据库后删除缓存的方案是可以保证数据一致性的。

如何解决操作缓存,操作数据库两步不一致问题?
  • 两步操作,不管哪个先哪个后,后面的失败了都会存在问题
    • 常用解决方案就是,重试补偿。

    • 重试的缺点

      • 依然有失败的几率
      • 重试次数过多,占用线程资源,无法服务其他客户端请求。
    • 可以使用异步重试
      在这里插入图片描述

      • 使用消息队列异步重试删除缓存
        • 消息队列保证可靠性投递
        • 消息队列保证消息成功投递
        • 项目中一般经常使用消息队列,维护成本没有增加
        • 写缓存和写消息队列失败的概率也很小
        • 引入消息队列解决两步不同步的问题,比较合适

在这里插入图片描述
- 订阅数据库binlog操作缓存
- 业务代码中不用操作缓存
- 数据库变更的时候,产生一条binlog,订阅这条binlog去删除对应的缓存
- 不用考虑消息队列写失败的问题(变更成功,一定有binlog)
- 自动投递下有的队列(canel)
- 推荐方案:先更新数据库 再删除缓存,然后使用消息队列或者canel订阅binlog,塞到下游队列的方案。

缓存双删策略
  • 先删除缓存,再更新数据库(存在缓存回填旧值)
    在这里插入图片描述
  • 主从架构
    在这里插入图片描述
  • 以上两种情况都导致读线程,回填了旧值到缓存中,到缓存失效,或者删除之前,读线程读的都是旧的脏数据。
  • 解决方案
    • 写线程A 休眠或者生成一个延时消息,再删除一次缓存。
      • 复杂的生产场景延时时间不太好确定
      • 一般针对主从的问题,就是延时时间大于主从复制(或者读线程,读数据库+写入缓存的时间)的时间多个几百毫秒.
      • 只能尽可能降低不一致的概率。
    • 实际场景中推荐先更新数据库,再删除缓存方案,然后尽量保证主从复制的时间不要太延迟,降低问题的概率
数据强一致性
  • 根据 CAP 和BASE理论,很难做到强一致性,想做到强一致性,可以使用2pc,3pc,paxos等一致性协议。也可以使用分布式锁来实现,但是会付出一定的代价,性能比较差点,违背了增加缓存提高响应的初衷。所以 一旦使用缓存就要做好容忍短期的一致性。

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

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

相关文章

win环境安装yarn脚手架

win环境安装yarn脚手架 1、安装命令 npm install -g yarn 2、查看安装的版本 yarn --version 报错了!!! 解决方案 搜索​​ PowerShell​​,右键以管理员身份运行; 输入:​​set-ExecutionPolicy Remo…

知虾shopee数据:为卖家提供了丰富的数据分析工具

使用Shopee的卖家都知道,这个平台为卖家提供了丰富的数据分析工具,帮助他们更好地理解店铺运营状况和市场趋势。这些数据分析工具不仅能够提供数据总览,还包括买家分析、商品排名、分类排名、销售辅导、流量分析、销售结构、行销活动、聊天响…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础…

整除判断-判断正整数a能否被b整除,如果不能整除,输出商和余数 C语言xdoj42

问题描述 判断正整数a能否被b整除&#xff0c;如果不能整除&#xff0c;输出商和余数 输入说明 输入两个正整数a和b&#xff08;0<a, b<10000&#xff09;&#xff0c;a和b之间用空格分隔。 输出说明 如果a能被b整除&#xff0c;输出yes&#xff0c;否则在同…

山区老人爱的礼物丨守护银龄,情暖寒冬

为让山区老人们在寒冷的冬天感受到来自社会的温暖&#xff0c;新年伊始&#xff0c;北京传益千里携手志愿者再次走进酉阳土家族苗族自治县木叶乡分发新的一轮山区老人爱的礼物&#xff0c;让更多的物资走向有需要的人群。 中午阳光正好&#xff0c;志愿者们走进山林中的人家&am…

文件销毁 硬盘销毁 数据销毁 物料销毁 淼一护航数据安全最后一公里

文件销毁、硬盘销毁、数据销毁以及物料销毁&#xff0c;是现代商业和行政管理中必须面对的重要环节。随着信息化程度的加深&#xff0c;数据安全和隐私保护已经成为全社会共同关注的焦点&#xff0c;而数据销毁则是确保信息安全的重要手段。淼一护航数据安全最后一公里&#xf…

开源协议简介和选择

软件国产化已经提到日程上了&#xff0c;先来研究一下开源协议。 引言 在追求“自由”的开源软件领域的同时不能忽视程序员的权益。为了激发程序员的创造力&#xff0c;现今世界上有超过60种的开源许可协议被开源促进组织&#xff08;Open Source Initiative&#xff09;所认可…

SCA面面观 | 企业该如何选择组件检测工具?

一般来说&#xff0c;一个软件应用程序可以被分解成若干部分&#xff0c;为软件程序解耦&#xff0c;以减少整个应用程序的复杂性&#xff0c;这些部分就是软件组件。以一种标准化的方式相互作用&#xff0c;使得组件可以像机器的“零部件”一样被换入或换出&#xff0c;因组件…

wait 和 notify 这个为什么要在synchronized 代码块中?

一个工作七年的小伙伴&#xff0c;竟然不知道” wait”和“notify”为什么要在 Synchronized 代码块中 。 好吧&#xff0c;如果屏幕前的你也不知道&#xff0c;请在公屏上刷”不知道“。 对于这个问题&#xff0c;我们来看看普通人和高手的回答。 一、问题解析 1. wait 和 n…

理解 Node.js 中的事件循环

你已经使用 Node.js 一段时间了&#xff0c;构建了一些应用程序&#xff0c;尝试了不同的模块&#xff0c;甚至对异步编程感到很舒适。但是有些事情一直在困扰着你——事件循环&#xff08;Event Loop&#xff09;。 如果你像我一样&#xff0c;花费了无数个小时阅读文档和观看…

将音频与视频格式互转的7 个顶级工具方法

你是否遇到过需要将视频文件从一种格式转换为另一种格式的情况&#xff1f; 在编辑家庭电影或者专业电影工作室工作&#xff0c;我们经常需要将视频文件转换成不同的格式。市场上有很多自称能够高效转换的工具&#xff0c;但是我们要时刻警惕诈骗工具&#xff0c;它们可能会耗…

【mac-m1 docker 安装upload-labs靶场】

1.搜索upload-labs docker search upload-labs 2.下载upload-labs docker pull c0ny1/upload-labs 3.启动 docker run -it -d --name uploadlabs -p 80:80 c0ny1/upload-labs --platform linux/amd64 4.访问127.0.0.1:80 注意点&#xff1a;后续使用的时候会报错 需要手动创…

BAT036:TXT与DOC格式互转、DOC与DOCX格式互转

引言:编写批处理程序,可实现txt与doc文档格式互转、doc与docx文档格式互转。 一、新建Windows批处理文件 参考博客: BAT002:在右键菜单新建中添加【Windows批处理文件】_为右键菜单添加bat-CSDN博客 二、TXT与DOC格式互转 1.右键新建的批处理文件,点击【编辑】。 ​ …

虚幻UE 增强输入-触发器

上一篇增强输入基础&#xff1a;虚幻UE 增强输入-第三人称模板增强输入分析与扩展 主要对第三人称模板的增强输入进行分析、复刻和扩展 本篇将会对增强输入中的触发器中的各参数进行讲解 文章目录 前言触发器参数1、下移TriggerDown2、已按下TriggerPressed3、已松开TriggerRel…

新手深入浅出理解PyTorch归一化层全解析

目录 torch.nn子模块normal层详解 nn.BatchNorm1d BatchNorm1d 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.BatchNorm2d BatchNorm2d 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.BatchNorm3d BatchNorm3d 函数简介 参…

为什么在国内考CISP比CISSP好?

在国内考CISP比CISSP好的原因主要有以下几点&#x1f447; 1️⃣国内认证认可度高 &#x1f48e;CISP是国内信息an全领域的重要认证&#xff0c;得到了国内政fu、企业和行业的高度认可。 2️⃣国内考试难度相对较低 由于CISP的考试内容与国内信息an全领域的实际情况更加贴近&am…

MySQL 8.0.32 双写参数和innodb_redo

版本为mysql 8.0.32 数据库内存和磁盘架构 #ib_16384_0.dblwr #ib_16384_0.dblwr和#ib_16384_2.dblwr 这两个文件有什么区别 从架构图中&#xff0c;不难看出这两个文件是双写buffer文件。 双写缓冲区是一个存储区域&#xff0c;在 InnoDB将页面写入 InnoDB数据文件中的正确…

C#上位机与欧姆龙PLC的通信10----开发专用的通讯工具软件(WPF版)

1、介绍 上节开发了一个winform版的通讯测试工具&#xff0c;这节再搞个wpf版的&#xff0c;wpf是什么&#xff1f;请自行百度&#xff0c;也可以看前面的博客&#xff0c;WPF真入门教程&#xff0c;wpf的界面效果是比winform漂亮&#xff0c;因为wpf使用了web项目中的css样式…

使用qtcreator创建qml项目(图解)

接下来就一直点继续&#xff0c;最后完成项目&#xff0c;如下图。 下面对项目进行一些基本的描述 &#xff08;1&#xff09;qt项目文件使用pro后缀&#xff0c;是qt项目的配置文件&#xff0c;它用于指定项目的各种参数&#xff0c;包括源文件、头文件、库依赖、编译选项等&a…

全网唯一值得推荐的C/C++框架和库

全网唯一值得推荐的C/C框架和库 C程序员开发指南 ​ 关注我&#xff0c;天天分享C/C开发技术干货&#xff01; ​关注他 30 人赞同了该文章 ​ 目录 收起 标准库 C通用框架和库 人工智能 异步事件循环 音频 生态学 压缩 并发性 容器 数据库 调试 游戏引擎 图…