缓存与数据库不一致,你遇到过吗?

相信大家偶尔会遇到缓存数据库不一致的问题。今天聊聊这个话题。
 
数据库主从,为什么会不一致?
先回顾下,无缓存时,数据库主从不一致问题。
缓存与数据库不一致,你遇到过吗?
如上图,发生的场景是,写后立刻读
(1)主库一个写请求(主从没同步完成);
(2)从库接着一个读请求,读到了旧数据;
(3)最后,主从同步完成;
 
导致的结果是:主动同步完成之前,会读取到旧数据
 
可以看到,主从不一致的影响时间很短,在主从同步完成后,就会读到新数据。
 
缓存与数据库,什么时候会不一致?
再看,引入缓存后,缓存和数据库不一致问题。
缓存与数据库不一致,你遇到过吗?
如上图,发生的场景也是,写后立刻读
(1+2)先一个写请求,淘汰缓存,写数据库;
(3+4+5)接着立刻一个读请求,读缓存,cache miss,读从库,写缓存放入数据,以便后续的读能够cache hit(主从同步没有完成,缓存中放入了旧数据);
(6)最后,主从同步完成;
 
导致的结果是:旧数据放入缓存,即使主从同步完成,后续仍然会从缓存一直读取到旧数据
 
可以看到,加入缓存后,导致的不一致影响时间会很长,并且最终也不会达到一致。
 
为什么会出现这类不一致?
可以看到,这里提到的缓存与数据库数据不一致,根本上是由数据库主从不一致引起的。当主库上发生写操作之后,从库binlog同步的时间间隔内,读请求,可能导致有旧数据入缓存。
 
假如主从不一致没法彻底解决,引入缓存之后,binlog同步时间间隔内,也无法避免读旧数据。
 
但是,有没有办法做到,即使引入缓存,不一致不会比“不引入缓存”更糟呢?这是更为实际的优化目标。
 
思路转化为:在从库同步完成之后,如果有旧数据入缓存,应该及时把这个旧数据淘汰掉
 
缓存与数据库不一致,可以怎么优化?
缓存与数据库不一致,你遇到过吗?
如上图所述,在并发读写导致缓存中读入了脏数据之后
(6)主从同步;
(7)通过工具订阅从库的binlog,这里能够最准确的知道,从库数据同步完成的时间;
画外音:本图画的订阅工具是DTS,可以是cannal,也可以自己订阅和分析binlog。
(8)从库执行完写操作,向缓存再次发起删除淘汰这段时间内可能写入缓存的旧数据;
 
如此这般,至少能够保证,引入缓存之后,主从不一致,不会比没有引入缓存更坏。 
架构师之路-分享可落地的技术文章
相关文章
架构师之路,20年干货精选
 
希望大家有收获,谢

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/5824

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月10日 下午10:21
下一篇 2022年5月10日 下午10:23

相关推荐

  • MySQL事务已提交,数据却丢了(MySQL事务提交,数据丢失)

    有个水友提问: 老师,我们有一次MySQL崩溃,重启后发现有些已经提交的事务对数据的修改丢失了,不是说事务能保证ACID特性么,想问下什么情况下可能导致“事务已经提交,数据却丢失”呢?   这个问题有点复杂,得先从redo log说起。   为什么要有redo log? 事务提交后,必须将事务对数据页的修改刷(fsync)到磁盘上,才能保证事务的ACID特性...

    2022年5月10日
    4100
  • 这个排序这么酷,为什么知道的人很少?

    有一种很神奇的排序,基数排序(Radix Sort),时间复杂度为O(n),今天花1分钟,通过几幅图,争取让大家搞懂细节。 画外音:居然还有时间复杂度为O(n)的排序算法?不但有,其实还有很多。   举个栗子: 假设待排序的数组arr={72, 11, 82, 32, 44, 13, 17, 95, 54, 28, 79, 56} 基数排序的两个关键要点: ...

    2022年5月11日
    1600
  • MySQL缓冲池(buffer pool),终于懂了!!!(收藏)

    应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。   操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问。   MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。   今天,和大家聊一聊InnoDB的缓冲池。...

    2022年5月10日
    3100
  • 究竟为啥总在凌晨上线,如何进行无损发布

    为什么很多互联网公司升级系统,选择在晚上上线? 美名其曰,晚上上线,对用户影响最小。   为什么会对用户产生影响? 很多人认为,系统升级往往需要重启,重启的过程中,正在访问的用户会访问失败。   例如,如果升级的是web-server: 如上图,重启ip1上的tomcat时,tomcat上或许有1000个http请求正在处理,这些请求就会失败。   又例如,...

    2022年5月15日
    4700
  • 7000字+24张图带你彻底弄懂线程池

    大家好。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。 一、什么是线程池 线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行...

    2023年1月26日
    1200

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信