什么是CacheAside模式
典型的缓存架构设计,常用于以MySQL为持久化存储,Redis为缓存的系统架构设计中,以下讲解均以此为基础
核心流程
写流程
先更新MySQL数据库,再删除Redis缓存。
读流程
挑战与不足
缓存穿透
详见 缓存穿透 篇章
解决方案
缓存不存在的空值【设置缓存有效时间TTL】
布隆过滤器:存在的不一定存在,不存在一定不存在
...
缓存击穿
详见 缓存击穿 篇章
解决方案
缓存永不过期
定时重建续期缓存
互斥锁【存在线程堆积】
此问题 面试被拷打过,呜呜呜
当热点 Key 缓存失效时,大量并发请求会在 “抢锁→等待→重试” 的过程中堆积,轻则导致请求延迟飙升,重则引发线程池耗尽、服务超时,甚至雪崩。
主从延迟问题【缓存数据不一致】
高并发+主从同步场景
缓存更新的时机无法及时与数据库同步,造成短时间的缓存不一致
| W | R |
|---|---|
| 写主库数据库,将数据从 88 更新为 100 | |
| 删除缓存 | |
| 读取缓存,缓存不存在 | |
| 读取从库数据库数据为88 | |
| 更新缓存为88 | |
| 主库 同步 数据100 至 从库 | |
| 读取缓存,缓存存在,数据为88【实际主库和从库数据已为100】 |
解决方案
延迟双删
CacheAside + Binlog异步更新
适合场景
读多写少场景
重要声明:
若文中存在表述不当、逻辑偏差等问题,恳请大佬们不吝赐教,可私信沟通或在评论区留言建议~ 虚心接纳每一份真诚反馈,感谢一路同行!
持久迭代更新版本链接🔗