缓存的三种更新模式
Cache Aside(旁路缓存)#
最常使用的模式。一般由写操作删除cache,读操作设置cache
写#
- 先更新DB
- 然后直接删除 cache
读#
- 从 cache 中读取数据,读取到就直接返回
- cache 中读取不到的话,就从 db 中读取数据返回
- 再把数据放到 cache 中。
缺陷#
缺陷1:首次请求或更新删除cache后,cache不存在,当访问量较大时会将请求打到DB#
- 提前刷入热点数据到cache
缺陷2:可能出现以下情况,主要出现在query中的[select db] 到 [update cache]耗费时间较长,可能中间做了一些代码计算#

- 追求强一致。加入分布式锁,主要保证[clear cache]与[select db]-[update cache]的顺序。缺点影响并发
- 非强一致。
- 延时双删。当update的[clear cache]完了之后,再做一次[clear cache],可以采用MQ延时消息,或其他异步手段来触发删除缓存动作
- [update cache]操作时合理设置cache的失效时间兜底
Read/Write Through(读写穿透)#
服务端把 cache 视为主要数据存储,从中读取数据并将数据写入其中。cache 服务负责将此数据读取和写入 db,从而减轻了应用程序的职责
写(Write Through):#
- 先查 cache,cache 中不存在,直接更新 db。
- cache 中存在,则先更新 cache,然后 cache 服务自己更新 db(同步更新 cache 和 db)。
读(Read Through):#
- 从 cache 中读取数据,读取到就直接返回 。
- 读取不到的话,先从 db 加载,写入到 cache 后返回响应。
与Cache-Aside比较#
- Cache-Aside的读操作由客户端负责写入cache,而Read-Through是由cache服务端负责写入cache,对客户端透明
Write Behind(异步缓存写入)#
又叫Write Back。在更新数据的时候,只更新缓存,不更新数据库,缓存服务会异步地批量更新数据库
消息队列中消息的异步写入磁盘、MySQL 的 Innodb Buffer Pool 机制都用到了这种策略。非常适合一些数据经常变化又对数据一致性要求没那么高的场景,比如浏览量、点赞量。

优势#
- 主要特性是I/O操作性能非常高
- 缓存刷新操作由cache服务端来完成,与客户端解耦
缺陷#
- 数据不是强一致性的,而且可能会丢失
总结#
- Cache-Aside。最常用的策略,由客户端读操作做cache刷新,写操作做cache删除
- Read/Write Through 与 Write Behind使用的一般较少。相同的是主要的刷新操作都由cache服务完成。
- Read Through与Cache-Aside的读操作流程相似,不同的是Read Through是由cache服务端完成,对客户端透明
- Write Through与Write Behind不同的是Write Behind只更新cache,不更新db,由cache服务异步批量更新db。而Write Through在没有读取到cache时会主动同步更新db
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了