缓存存储,也是数据的冗余。

(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一个旧数据,最终导致数据库和缓存数据不一致。

如何解决这种情况下,缓存与数据库数据不一致的问题,是下一章要讨论的内容。

究竟先操作缓存,还是数据库?相关推荐

  1. 并发环境下,先操作数据库还是先操作缓存?

    点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操 ...

  2. 缓存与数据库的一致性:先操作缓存还是先操作数据库?

    数据缓存 在我们实际的业务场景中,一定有很多需要做数据缓存的场景,比如售卖商品的页面,包括了许多并发访问量很大的数据,它们可以称作是是"热点"数据,这些数据有一个特点,就是更新频率 ...

  3. cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?

    原标题:并发环境下,先操作数据库还是先操作缓存? 来源:捡田螺的小男孩 前言 在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案 展开阐述对比,谢谢阅 ...

  4. 好文推荐 | 缓存与数据库一致性问题深度剖析 (修订)

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:后端技术漫谈 当我们在做数据库与缓存数据同步时,究竟更新缓存,还是删 ...

  5. 8种方案,保证缓存和数据库的最终一致性

    前言 我们通常使用缓存机制来提升系统的性能,缓存系统下的读写操作,一般都需要操作数据库与缓存. 对于读操作,一般是先查询缓存,查询不到再查询数据库,最后回写进缓存. 而对于写操作,究竟是先删除(更新) ...

  6. 链接mysql_使用python链接mysql及redis(缓存型数据库)

    python链接数据库mysql操作,首先我们需要借助第三方库pymysql. cmd终端下载:pip install pymysql import pymysql#链接数据库db = pymysql ...

  7. 面试:高频面试题:如何保证缓存与数据库的双写一致性?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | blog.csdn.net/chang384915878 ...

  8. 面试必问:怎么保证缓存与数据库的双写一致性?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 来源:https://dwz.cn/5AlJ2nWV 只要用缓存,就可能会涉及到缓存与数据库 ...

  9. onbeforeedit和onbeginedit数据不一致_Redis缓存与数据库产生不一致的问题该如何解决?...

    不一致产生的原因 我们在使用redis过程中,通常会这样做:先读取缓存,如果缓存不存在,则读取数据库.伪代码如下: Object stuObj = new Object();public Stu ge ...

  10. 高频面试题:如何保证缓存与数据库的双写一致性?

    分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? Cache Aside ...

最新文章

  1. maven打包常用的几个插件
  2. 全文!《2018中国IoT报告》!
  3. 项目收获与体会_员工之声|在项目实践中提高,在团队合作中成长——参与项目有感...
  4. maven 使用 问题记录
  5. axios捕获401 赋值token
  6. conflicting types for xx错误
  7. Angular CLI版本问题(Your global Angular CLI version (12.2.7) is greater than your local version (9.0.3))
  8. Jackson 注解 -- 自定义输出格式
  9. 御龙在天找回以前的服务器,奋起直追!掉队系统找回经验
  10. disk genius_如何预约Apple Store商店或Genius Bar
  11. mysql collect_set_hive列转行 (collect_set())
  12. bat执行exe程序_dos命令start教程,并行运行exe程序或者启动bat批处理cmd脚本
  13. clion eap 预览版 免费版
  14. 虚拟空间和服务器哪个快,云服务器快还是虚拟空间快
  15. UVA10735 Euler Circuit题解
  16. 数字化时代,安全沙箱技术促进企业网络安全生态安全运转
  17. 集合--List集合练习--集合的嵌套、Random类获取随机数
  18. 一起搭建私有物联网云平台讲解
  19. 论文所涉及公司简介是否需要查重?
  20. 未来人工智能人才,需要具备哪些基本特征?

热门文章

  1. 浅谈对于业务中台的理解
  2. 详解阿里云第六代增强型实例,性能强劲,百万IOPS加持
  3. 新兴IT企业特斯拉(二)——特斯拉的诞生
  4. 【图像去噪】基于matlab小波域双重局部维娜滤板图像去噪【含Matlab源码 1642期】
  5. 【数字信号调制】基于matlab多进制数字相位调制(4PSK)【含Matlab源码 1001期】
  6. 【背包问题】基于matlab遗传算法求解多背包问题【含Matlab源码 122期】
  7. 【优化预测】基于matlab飞蛾扑火算法优化LSSVM预测【含Matlab源码 142期】
  8. 计算机应用技术与英语相关性,浅析计算机应用的技术专业的计算机专业英语的教学改进.doc...
  9. 人脸识别 特征值脸_你的脸值多少钱?
  10. 后台运行 命令_Docker基本命令