技术圈首页
程序员
解决方案
聚合短信
APP下载
登录
注册
首页
文章详情
穿透类缓存Cache使用,这一篇就够了!
架构师之路
|
244
2021-12-28 16:23
0
0
0
有些成熟的技术方案,用不着创新,固化下来的模式
(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年干货精选
》
希望大家有启示,求帮
转
。
0
赞
0
收藏
×
添加附言
附加内容, 使用此功能的话, 会给所有参加过讨论的人发送提醒.
回复数量:
0
暂无评论~~
请注意单词拼写,以及中英文排版,
参考此页
支持 Markdown 格式,
**粗体**
、~~删除线~~、
`单行代码`
, 更多语法请见这里
Markdown 语法
支持表情,见
Emoji cheat sheet
@name 会链接到用户页面,并会通知他
上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jp(e)g, png, gif
Ctrl+Enter
下载APP
架构师之路
437
文章
1
获赞
关注TA
NEW
相关文章推荐
浅谈缓存模式
再见Navicat!这个工具才是YYDS!
不知道这4种缓存模式,敢说懂缓存吗?
4种常见的缓存模式,你都知道吗?
不知道这4种缓存模式,敢说懂缓存吗?
不知道这4种缓存模式,敢说懂缓存吗?
高并发场景下,到底先更新缓存还是先更新数据库?
高并发场景下,到底先更新缓存还是先更新数据库?