缓存与数据库不一致,你遇到过吗? 糖太宗 • 2022年5月10日 下午10:21 • 技术 • 阅读 15 相信大家偶尔会遇到缓存与数据库不一致的问题。今天聊聊这个话题。 数据库主从,为什么会不一致? 先回顾下,无缓存时,数据库主从不一致问题。 如上图,发生的场景是,写后立刻读: (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) 打赏 微信扫一扫 支付宝扫一扫 糖太宗 0 0 生成海报 穿透类缓存Cache使用,这一篇就够了! 上一篇 2022年5月10日 下午10:21 别废话,各种SQL到底加了什么锁? 下一篇 2022年5月10日 下午10:23 相关推荐 技术 MySQL事务已提交,数据却丢了(MySQL事务提交,数据丢失) 有个水友提问: 老师,我们有一次MySQL崩溃,重启后发现有些已经提交的事务对数据的修改丢失了,不是说事务能保证ACID特性么,想问下什么情况下可能导致“事务已经提交,数据却丢失”呢? 这个问题有点复杂,得先从redo log说起。 为什么要有redo log? 事务提交后,必须将事务对数据页的修改刷(fsync)到磁盘上,才能保证事务的ACID特性... 糖太宗 2022年5月10日 41001 技术 这个排序这么酷,为什么知道的人很少? 有一种很神奇的排序,基数排序(Radix Sort),时间复杂度为O(n),今天花1分钟,通过几幅图,争取让大家搞懂细节。 画外音:居然还有时间复杂度为O(n)的排序算法?不但有,其实还有很多。 举个栗子: 假设待排序的数组arr={72, 11, 82, 32, 44, 13, 17, 95, 54, 28, 79, 56} 基数排序的两个关键要点: ... 糖太宗 2022年5月11日 16000 技术 MySQL缓冲池(buffer pool),终于懂了!!!(收藏) 应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问。 MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。 今天,和大家聊一聊InnoDB的缓冲池。... 糖太宗 2022年5月10日 31000 技术 究竟为啥总在凌晨上线,如何进行无损发布 为什么很多互联网公司升级系统,选择在晚上上线? 美名其曰,晚上上线,对用户影响最小。 为什么会对用户产生影响? 很多人认为,系统升级往往需要重启,重启的过程中,正在访问的用户会访问失败。 例如,如果升级的是web-server: 如上图,重启ip1上的tomcat时,tomcat上或许有1000个http请求正在处理,这些请求就会失败。 又例如,... 糖太宗 2022年5月15日 47000 技术 7000字+24张图带你彻底弄懂线程池 大家好。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。 一、什么是线程池 线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行... 糖太宗 2023年1月26日 12000 发表回复 您的电子邮箱地址不会被公开。 必填项已用*标注*昵称: *邮箱: 网址: 记住昵称、邮箱和网址,下次评论免输入 提交