CacheAside

21 阅读2分钟

什么是CacheAside模式

典型的缓存架构设计,常用于以MySQL为持久化存储,Redis为缓存的系统架构设计中,以下讲解均以此为基础

核心流程

写流程

先更新MySQL数据库,再删除Redis缓存。

读流程

挑战与不足

缓存穿透

详见 缓存穿透 篇章

解决方案

缓存不存在的空值【设置缓存有效时间TTL】

布隆过滤器:存在的不一定存在,不存在一定不存在

...

缓存击穿

详见 缓存击穿 篇章

解决方案
缓存永不过期
定时重建续期缓存
互斥锁【存在线程堆积】

此问题 面试被拷打过,呜呜呜

当热点 Key 缓存失效时,大量并发请求会在 “抢锁→等待→重试” 的过程中堆积,轻则导致请求延迟飙升,重则引发线程池耗尽、服务超时,甚至雪崩。

主从延迟问题【缓存数据不一致】

高并发+主从同步场景

缓存更新的时机无法及时与数据库同步,造成短时间的缓存不一致

WR
写主库数据库,将数据从 88 更新为 100
删除缓存
读取缓存,缓存不存在
读取从库数据库数据为88
更新缓存为88
主库 同步 数据100 至 从库
读取缓存,缓存存在,数据为88【实际主库和从库数据已为100】
解决方案
延迟双删
CacheAside + Binlog异步更新

适合场景

读多写少场景

重要声明:

若文中存在表述不当、逻辑偏差等问题,恳请大佬们不吝赐教,可私信沟通或在评论区留言建议~ 虚心接纳每一份真诚反馈,感谢一路同行!

持久迭代更新版本链接🔗

www.yuque.com/buranyixiao…