您现在的位置是:亿华云 > 应用开发
Cache Aside Pattern(缓存模式)解析
亿华云2025-10-08 20:59:32【应用开发】5人已围观
简介在《究竟先操作缓存,还是数据库?》,有同学在评论提出,相关方案违背了“Cache Aside Pattern”的原则,故今天聊一聊Cache Aside Pattern。另外,在讨论技术方案时,尽量不
在《究竟先操作缓存,存模还是式解数据库?》,有同学在评论提出,存模相关方案违背了“Cache Aside Pattern”的式解原则,故今天聊一聊Cache Aside Pattern。存模
另外,式解在讨论技术方案时,存模尽量不说:
“你是式解错的,应该怎么样” “facebook不是存模这样,所以你是式解错的”画外音:凭什么facebook就是真理?它的方案只是适合它的业务而已。
说明适用场景,存模说明来龙去脉,式解说明前因后果,存模比具体使用什么方案更重要。式解
什么是存模“Cache Aside Pattern”?
答:旁路缓存方案的经验实践,这个实践又分读实践,写实践。
对于读请求
先读cache,再读db 如果,cache hit,则直接返回数据 如果,网站模板cache miss,则访问db,并将数据set回缓存如上图:
先从cache中尝试get数据,结果miss了 再从db中读取数据,从库,读写分离 ***把数据set回cache,方便下次读***画外音:这一点上,与《究竟先操作缓存,还是数据库?》说的是一致的。
对于写请求
淘汰缓存,而不是更新缓存 先操作数据库,再淘汰缓存如上图:
(1)***步要操作数据库,第二步操作缓存
画外音:这一点上,与《究竟先操作缓存,还是数据库?》说的不一致,也是评论反驳比较激烈的地方。
(2)缓存,采用delete淘汰,而不是set更新
画外音:这一点上,与《缓存,究竟是淘汰,还是香港云服务器修改?》说的是一致的。
Cache Aside Pattern为什么建议淘汰缓存,而不是更新缓存?
答:如果更新缓存,在并发写时,可能出现数据不一致。
如上图所示,如果采用set缓存。
在1和2两个并发写发生时,由于无法保证时序,此时不管先操作缓存还是先操作数据库,都可能出现:
请求1先操作数据库,请求2后操作数据库 请求2先set了缓存,请求1后set了缓存导致,数据库与缓存之间的数据不一致。
所以,Cache Aside Pattern建议,delete缓存,而不是set缓存。
Cache Aside Pattern为什么建议先操作数据库,再操作缓存?
答:如果先操作缓存,在读写并发时,可能出现数据不一致。
如上图所示,如果先操作缓存。
在1和2并发读写发生时,由于无法保证时序,源码库可能出现:
写请求淘汰了缓存 写请求操作了数据库(主从同步没有完成) 读请求读了缓存(cache miss) 读请求读了从库(读了一个旧数据) 读请求set回缓存(set了一个旧数据) 数据库主从同步完成导致,数据库与缓存的数据不一致。
所以,Cache Aside Pattern建议,先操作数据库,再操作缓存。
Cache Aside Pattern方案存在什么问题?
答:如果先操作数据库,再淘汰缓存,在原子性被破坏时:
修改数据库成功了 淘汰缓存失败了导致,数据库与缓存的数据不一致。
如何解决这类问题呢?
答:详见《究竟先操作缓存,还是数据库?》。
【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】
戳这里,看该作者更多好文
很赞哦!(99286)
相关文章
- 审核通过的域名将显示在域名竞拍页面,并进入正式拍卖期,买家可以在拍卖周期内出价,加价幅度与拍卖保证金说明,点此查看。
- 鸿蒙HarmonyOS三方件开发指南(17)-BottomNavigationBar
- Promise.allSettled 的作用,如何自己实现一个 Promise.allSettled
- 为什么说VR交互不一定要追求“准确性”?
- 第五步:重复第四步,直到找到正确的纪录。
- 七天近千星!哈佛小哥这个Github仓库从零开始教你计算机图形学
- 从一道简单算法题里面解释什么叫做 O(1)
- 一篇带给你k8s的可观测性
- 互联网其实拼的也是人脉,域名投资也是一个时效性很强的东西,一个不起眼的消息就会引起整个域名投资市场的动荡,因此拓宽自己的人脉圈,完善自己的信息获取渠道,让自己能够掌握更为多样化的信息,这样才更有助于自己的域名投资。
- Hadoop集群搭建及Python操作