Cache Aside Pattern
在《究竟先操作缓存,还是数据库?》,有同学在评论提出,相关方案违背了“Cache Aside Pattern”的原则,故今天聊一聊Cache Aside Pattern。
另外,在讨论技术方案时,尽量不说:
“你是错的,应该怎么样”
“facebook不是这样,所以你是错的”
画外音:凭什么facebook就是真理?它的方案只是适合它的业务而已。
说明适用场景,说明来龙去脉,说明前因后果,比具体使用什么方案更重要。
什么是“Cache Aside Pattern”?
答:旁路缓存方案的经验实践,这个实践又分读实践,写实践。
对于读请求
先读cache,再读db
如果,cache hit,则直接返回数据
如果,cache miss,则访问db,并将数据set回缓存
如上图:
(1)先从cache中尝试get数据,结果miss了
(2)再从db中读取数据,从库,读写分离
(3)最后把数据set回cache,方便下次读命中
画外音:这一点上,与《究竟先操作缓存,还是数据库?》说的是一致的。
对于写请求
淘汰缓存,而不是更新缓存
先操作数据库,再淘汰缓存
如上图:
(1)第一步要操作数据库,第二步操作缓存
画外音:这一点上,与《究竟先操作缓存,还是数据库?》说的不一致,也是评论反驳比较激烈的地方。
(2)缓存,采用delete淘汰,而不是set更新
画外音:这一点上,与《缓存,究竟是淘汰,还是修改?》说的是一致的。
Cache Aside Pattern为什么建议淘汰缓存,而不是更新缓存?
答:如果更新缓存,在并发写时,可能出现数据不一致。
如上图所示,如果采用set缓存。
在1和2两个并发写发生时,由于无法保证时序,此时不管先操作缓存还是先操作数据库,都可能出现:
(1)请求1先操作数据库,请求2后操作数据库
(2)请求2先set了缓存,请求1后set了缓存
导致,数据库与缓存之间的数据不一致。
所以,Cache Aside Pattern建议,delete缓存,而不是set缓存。
Cache Aside Pattern为什么建议先操作数据库,再操作缓存?
答:如果先操作缓存,在读写并发时,可能出现数据不一致。
如上图所示,如果先操作缓存。
在1和2并发读写发生时,由于无法保证时序,可能出现:
(1)写请求淘汰了缓存
(2)写请求操作了数据库(主从同步没有完成)
(3)读请求读了缓存(cache miss)
(4)读请求读了从库(读了一个旧数据)
(5)读请求set回缓存(set了一个旧数据)
(6)数据库主从同步完成
导致,数据库与缓存的数据不一致。
所以,Cache Aside Pattern建议,先操作数据库,再操作缓存。
Cache Aside Pattern方案存在什么问题?
答:如果先操作数据库,再淘汰缓存,在原子性被破坏时:
(1)修改数据库成功了
(2)淘汰缓存失败了
导致,数据库与缓存的数据不一致。
如何解决这类问题呢?
答:详见《究竟先操作缓存,还是数据库?》。
任何技术方案的设计,都是折衷。
只有适合的方案,未必有最优的方案。
技术人,不是被动接受,而要主动思考。
相关推荐:
《进程内缓存,究竟怎么玩?》
《选redis还是memcache,源码怎么说?》
《缓存,你真的用对了么?》
《缓存,究竟是淘汰,还是修改?》
《缓存,并发更新的大坑?》
《数据库主从不一致,怎么解?》
《究竟先操作缓存,还是数据库?》
文字很短,希望大家有启示,求帮转。
Cache Aside Pattern相关推荐
- 缓存读写策略 Cache Aside Pattern,开发必备
我们在前面讲到了当我们业务面临大量写并发的时候,将数据库开发成分布式存储系统,然后又介绍了NoSql数据库与关系型数据库互相配合,以用来更好的服务与我们的业务发展.但随着并发的持续增加,存储数据量的增 ...
- Cache Aside Pattern(缓存模式)
本文主要讨论这么几个问题: (1)"缓存与数据库"需求缘起 (2)"淘汰缓存"还是"更新缓存" (3)缓存和数据库的操作时序 一.需求缘起 ...
- 常用缓存读写策略(cache读写策略)
文章目录 前言 一.Cache Aside Pattern (旁路缓存模式) 二.Read/Write Through Pattern(读写穿透模式) 三.Write Behind Pattern(异 ...
- 缓存模式(Cache Aside、Read Through、Write Through、Write Behind)
概览 缓存是一个有着更快的查询速度的存储技术,这里的更快是指比起从初始的数据源查询(比如数据库,以下都称作数据库)而言.我们经常会把频繁请求的或是耗时计算的数据缓存起来,在程序收到请求这些数据的时候可 ...
- 缓存更新的Design Pattern -- 缓存专题(2)
黄粱一梦终须醒, 无根无极本归尘. 金龙飞天归何处, 不如凡间做真人! 上个周忙活了一周上线工作,因为银行的行业性质,与国家安全.国家政策强相关.所以对上线版本的质量要求都很高,因而每一次上线前担惊害 ...
- [由零开始]Guava Cache介绍和用法
Guava Cache介绍 Guava是Google提供的一套Java工具包,而Guava Cache是一套非常完善的本地缓存机制(JVM缓 存). Guava cache的设计来源于CurrentH ...
- Guava Cache介绍
1.缓存回顾: 使用场景:互联网,数据越来越多,用户越来越多,并发量.吞吐量越来越大 使用数据库存储,分库分表,也不能满足要求,使用缓存,减轻数据库的压力 临时存储的数据 其他的场景:Session分 ...
- Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略
1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...
- 面试:高频面试题:如何保证缓存与数据库的双写一致性?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | blog.csdn.net/chang384915878 ...
最新文章
- 追一科技热招职位来袭:AI新世界,不做旁观者
- CTreeCtrl的用法
- 有什么好一点的方法读jdk源码吗?
- 中国兽医牙科X射线发生器市场趋势报告、技术动态创新及市场预测
- m_map投影_MATLAB——m_map指南(1)
- Linux 安装flash
- CAD图纸被加密了,如何打开?
- 实用小软件实现Mac读写ntfs U盘 移动硬盘
- Linux命令怎么查找IP,在Linux中,如何查找您的IP地址
- FRP分享 Padavan
- 用word模板制作幻灯片
- 网站留言板防重复留言_公众号留言板怎么弄
- ServiceMesh和SideCar
- 操作系统_逻辑地址转换为物理地址
- mac微信备份位置macos手机微信备份的文件迁移走
- mac安装adb报错Unknown command: cask
- Python——CSV读取大文件报错_csv.Error: field larger than field limit
- 这些常用的java工具类你都知道吗?
- 艺术留学|服装设计专业2019院校排名
- 巧用TWaver 3D 矢量图形功能