究竟先操作缓存,还是数据库?
缓存存储,也是数据的冗余。
(1)数据库访问数据,磁盘IO,慢;
(2)缓存里访问数据,存操作,快;
(3)数据库里的热数据,可在缓存冗余一份;
(4)先访问缓存,如果命中,能大大的提升访问速度,降低数据库压力;
这些,是缓存的核心读加速原理。
但是,一旦没有命中缓存,或者一旦涉及写操作,流程会比没有缓存更加复杂,这些是今天要分享的话题。
读操作,如果没有命中缓存,流程是怎么样的?
答:如下图所示
(1)尝试从缓存get数据,结果没有命中;
(2)从数据库获取数据,读从库,读写分离;
(3)把数据set到缓存,未来能够命中缓存;
读操作的流程应该没有歧义。
写操作,流程是怎么样的?
答:写操作,既要操作数据库中的数据,又要操作缓存里的数据。
这里,有两个方案:
(1)先操作数据库,再操作缓存;
(2)先操作缓存,再操作数据库;
并且,希望保证两个操作的原子性,要么同时成功,要么同时失败。
这演变为一个分布式事务的问题,保证原子性十分困难,很有可能出现一半成功,一半失败,接下来看下,当原子性被破坏的时候,分别会发生什么。
一、先操作数据库,再操作缓存
如上图,正常情况下:
(1)先操作数据库,成功;
(2)再操作缓存(delete或者set),也成功;
但如果这两个动作原子性被破坏:第一步成功,第二步失败,会导致,数据库里是新数据,而缓存里是旧数据,业务无法接受。
画外音:如果第一步就失败,可以返回调用方50X,不会出现数据不一致。
二、先操作缓存,再操作数据库
如上图,正常情况下:
(1)先操作缓存(delete或者set),成功;
(2)再操作数据库,也成功;
画外音:如果第一步就失败,也可以返回调用方50X,不会出现数据不一致。
如果原子性被破坏,会发生什么呢?
这里又分了两种情况:
(1)操作缓存使用set
(2)操作缓存使用delete
使用set的情况:第一步成功,第二步失败,会导致,缓存里是set后的数据,数据库里是之前的数据,数据不一致,业务无法接受。
并且,一般来说,数据最终以数据库为准,写缓存成功,其实并不算成功。
使用delete的情况:第一步成功,第二步失败,会导致,缓存里没有数据,数据库里是之前的数据,数据没有不一致,对业务无影响。只是下一次读取,会多一次cache miss。
画外音:此时可以返回调用方50X。
最终,先操作缓存,还是先操作数据库?
答:
(1)读请求,先读缓存,如果没有命中,读数据库,再set回缓存
(2)写请求
(2.1)先缓存,再数据库
(2.2)缓存,使用delete,而不是set
画外音:《缓存,究竟是淘汰,还是修改?**》也提到了,淘汰缓存还是修改缓存的建议。
希望大家有收获,有不同方案欢迎讨论。
末了,挖个坑:
在缓存读取流程中,如果主从没有同步完成,步骤二读取到一个旧数据,可能导致缓存里set一个旧数据,最终导致数据库和缓存数据不一致。
如何解决这种情况下,缓存与数据库数据不一致的问题,是下一章要讨论的内容。
究竟先操作缓存,还是数据库?相关推荐
- 并发环境下,先操作数据库还是先操作缓存?
点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操 ...
- 缓存与数据库的一致性:先操作缓存还是先操作数据库?
数据缓存 在我们实际的业务场景中,一定有很多需要做数据缓存的场景,比如售卖商品的页面,包括了许多并发访问量很大的数据,它们可以称作是是"热点"数据,这些数据有一个特点,就是更新频率 ...
- cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?
原标题:并发环境下,先操作数据库还是先操作缓存? 来源:捡田螺的小男孩 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案 展开阐述对比,谢谢阅 ...
- 好文推荐 | 缓存与数据库一致性问题深度剖析 (修订)
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:后端技术漫谈 当我们在做数据库与缓存数据同步时,究竟更新缓存,还是删 ...
- 8种方案,保证缓存和数据库的最终一致性
前言 我们通常使用缓存机制来提升系统的性能,缓存系统下的读写操作,一般都需要操作数据库与缓存. 对于读操作,一般是先查询缓存,查询不到再查询数据库,最后回写进缓存. 而对于写操作,究竟是先删除(更新) ...
- 链接mysql_使用python链接mysql及redis(缓存型数据库)
python链接数据库mysql操作,首先我们需要借助第三方库pymysql. cmd终端下载:pip install pymysql import pymysql#链接数据库db = pymysql ...
- 面试:高频面试题:如何保证缓存与数据库的双写一致性?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | blog.csdn.net/chang384915878 ...
- 面试必问:怎么保证缓存与数据库的双写一致性?
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 来源:https://dwz.cn/5AlJ2nWV 只要用缓存,就可能会涉及到缓存与数据库 ...
- onbeforeedit和onbeginedit数据不一致_Redis缓存与数据库产生不一致的问题该如何解决?...
不一致产生的原因 我们在使用redis过程中,通常会这样做:先读取缓存,如果缓存不存在,则读取数据库.伪代码如下: Object stuObj = new Object();public Stu ge ...
- 高频面试题:如何保证缓存与数据库的双写一致性?
分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? Cache Aside ...
最新文章
- maven打包常用的几个插件
- 全文!《2018中国IoT报告》!
- 项目收获与体会_员工之声|在项目实践中提高,在团队合作中成长——参与项目有感...
- maven 使用 问题记录
- axios捕获401 赋值token
- conflicting types for xx错误
- Angular CLI版本问题(Your global Angular CLI version (12.2.7) is greater than your local version (9.0.3))
- Jackson 注解 -- 自定义输出格式
- 御龙在天找回以前的服务器,奋起直追!掉队系统找回经验
- disk genius_如何预约Apple Store商店或Genius Bar
- mysql collect_set_hive列转行 (collect_set())
- bat执行exe程序_dos命令start教程,并行运行exe程序或者启动bat批处理cmd脚本
- clion eap 预览版 免费版
- 虚拟空间和服务器哪个快,云服务器快还是虚拟空间快
- UVA10735 Euler Circuit题解
- 数字化时代,安全沙箱技术促进企业网络安全生态安全运转
- 集合--List集合练习--集合的嵌套、Random类获取随机数
- 一起搭建私有物联网云平台讲解
- 论文所涉及公司简介是否需要查重?
- 未来人工智能人才,需要具备哪些基本特征?
热门文章
- 浅谈对于业务中台的理解
- 详解阿里云第六代增强型实例,性能强劲,百万IOPS加持
- 新兴IT企业特斯拉(二)——特斯拉的诞生
- 【图像去噪】基于matlab小波域双重局部维娜滤板图像去噪【含Matlab源码 1642期】
- 【数字信号调制】基于matlab多进制数字相位调制(4PSK)【含Matlab源码 1001期】
- 【背包问题】基于matlab遗传算法求解多背包问题【含Matlab源码 122期】
- 【优化预测】基于matlab飞蛾扑火算法优化LSSVM预测【含Matlab源码 142期】
- 计算机应用技术与英语相关性,浅析计算机应用的技术专业的计算机专业英语的教学改进.doc...
- 人脸识别 特征值脸_你的脸值多少钱?
- 后台运行 命令_Docker基本命令