首页
下载应用
提交文章
关于我们
问卷:你怎么看自由微信?
🔥 热搜 🔥
1
上海
2
习近平
3
新疆
4
鄂州父女瓜
5
乌鲁木齐
6
疫情
7
H工口小学生赛高
8
习明泽
9
芊川一笑图包
10
印尼排华
分类
社会
娱乐
国际
人权
科技
经济
其它
首页
下载应用
提交文章
关于我们
问卷:你怎么看自由微信?
🔥
热搜
🔥
1
上海
2
习近平
3
新疆
4
鄂州父女瓜
5
乌鲁木齐
6
疫情
7
H工口小学生赛高
8
习明泽
9
芊川一笑图包
10
印尼排华
分类
社会
娱乐
国际
人权
科技
经济
其它
白石洲拆迁后,那些上学奔波的孩子都去哪儿了?
一个医保局长之死
给宠物做保姆的中国留学生
本以为吴京大儿子叫“吴所谓”够随意了,听到二儿子名字,真服了
法院4.2元拍卖一瓶雪碧,限自提!被执行人回应:没有更多可供执行财产
生成图片,分享到微信朋友圈
查看原文
其他
穿透类缓存Cache使用,这一篇就够了!
Original
58沈剑
架构师之路
2022-07-22
收录于合集
#缓存
5 个
#互联网
48 个
#架构
78 个
#微服务
16 个
有些成熟的技术方案,用不着创新,固化下来的模式
(pattern)
,学就完了。例如,穿透类缓存的使用,
“Cache Aside Pattern”
就是很好的实践沉淀,故今天聊一聊
Cache Aside Pattern
。
画外音:就好像“设计模式”,它就是沉淀下来的设计方法。
什么是“Cache Aside Pattern”?
旁路缓存方案的经验实践,这个实践又分
读实践,写实践
。
画外音:与旁路缓存对应的,是穿透缓存。
读实践是怎么样的?
对于读请求:
(1)先读cache,再读db;
(2)如果,cache hit,则直接返回数据;
(3)如果,cache miss,则访问db,并将数据set回缓存;
如上图:
(1)先从cache中尝试get数据,结果miss了;
(2)再从db中读取数据,从库,读写分离;
(3)最后把数据set回cache,方便下次读命中;
写实践是怎么样的?
对于写请求:
(1)淘汰缓存,而不是更新缓存;
(2)先操作数据库,再淘汰缓存;
如上图:
(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)淘汰缓存失败了;
导致,数据库与缓存的数据不一致。
Cache Aside Pattern
总结:
对于读请求:
(1)先读cache,再读db;
(2)如果,cache hit,则直接返回数据;
(3)如果,cache miss,则访问db,并将数据set回缓存;
对于写请求:
(1)淘汰缓存,而不是更新缓存;
(2)先操作数据库,再淘汰缓存;
任何技术方案的设计,都是折衷。
架构师之路
-分享
可落地
的技术文章
相关文章
:
《
架构师之路,20年干货精选
》
希望大家有启示,求帮转。
您可能也对以下帖子感兴趣
{{{title}}}
文章有问题?点此查看未经处理的缓存