更新缓存的策略
更新缓存的策略
Redis进阶 - 缓存问题:一致性, 穿击, 穿透, 雪崩, 污染等 | Java 全栈知识体系
更新缓存的策略
| 策略模式 | 策略模式 | 读逻辑 | 写逻辑 | 缓存角色 | 一致性 | 性能特点 | 典型案例 |
|---|---|---|---|---|---|---|---|
| 旁路缓存策略 | Cache-Aside | 业务先查缓存,未命中读DB+回填缓存 | 业务先写DB,再删缓存 | 被动缓存 | 最终一致 | 读写均衡 | Redis缓存用户信息 |
| 读穿透 | Read-Through | 业务只读缓存,未命中的话缓存自动从DB加载并返回 | 智能缓存 | 最终一致 | 读优化 | Caffeine/Guava本地缓存 | |
| 写穿透 | Write-Through | 业务写缓存,缓存同步写DB | 数据代理 | 强一致 | 写较差 | 数据库物化视图 | |
| 写回/写缓冲 | Write-Behind | 业务写缓存,缓存异步写DB | 写入缓冲区 | 弱一致 | 写极佳 | MySQL Buffer Pool | |
| 绕写 | Write-Around | 业务只写DB,不碰缓存 | 只读缓存 | 最终一致 | 写优化 | 日志/审计数据缓存 |
MySQL的Buffer Pool(缓冲池) 使用的是 Read-Through 和 Write-Back(回写)的组合策略。
组合选择指南
| 业务需求 | 推荐组合 | 理由 |
|---|---|---|
| 通用Web应用 | Read-Through + Write-Around | 简单可靠,开发效率高 |
| 高并发系统 | Read-Through + Write-Behind | 性能极致,吞吐量最大 |
| 金融/交易 | Read-Through + Write-Through | 强一致性,数据可靠 |
| 复杂业务逻辑 | Cache-Aside | 灵活控制,性能良好 |
核心原则: 根据业务的读写比例、一致性要求、性能需求来混合搭配。
关键区别总结
| 策略 | 读操作核心 | 写操作核心 | 一句话业务逻辑 |
|---|---|---|---|
| Cache-Aside | cache.get() +db.query() |
db.update() + cache.delete() |
"缓存没了?自己从DB拿。更新了?让缓存失效。" |
| Read-Through | cache.get() |
"我只要缓存,它自己会加载。更新了?让缓存失效。" | |
| Write-Through | cache.update() |
"我只要缓存,读写都找它,它负责同步DB。" | |
| Write-Behind | cache.update() |
"我只要缓存,读写都找它,它以后会同步DB。" | |
| Write-Around | db.update() |
"缓存没了?自己从DB拿。更新?不关缓存的事。" |
核心演进路线:
- Cache-Aside:业务代码全权负责
- Read/Write-Through:业务代码只操作缓存,逻辑下沉
- Write-Behind:在Through基础上,写数据库变为异步,性能最高
- Write-Around 不是技术上的"演进",而是设计思路的另一种选择——当缓存变得复杂时,选择回归简单。
完整的核心演进路线
第一阶·业务全权管理
Cache-Aside: 业务代码全权负责缓存策略
# 业务要处理所有缓存逻辑
if not cache.has(key):
data = db.get(key) # 业务负责加载
cache.set(key, data) # 业务负责回填
第二阶·逻辑下沉
Read/Write-Through: 业务代码只操作缓存,逻辑下沉到缓存层
# 业务只跟缓存交互
data = cache.get(key) # 缓存自动处理未命中
cache.set(key, data) # 缓存同步写DB
第三阶·异步优化
Write-Behind: 在 Through 基础上,写数据库变为异步
# 业务只跟缓存交互,但写入性能大幅提升
cache.set(key, data) # 立即返回,异步写DB
特殊分支·写时绕开
Write-Around: 回归简单,写操作完全绕开缓存
# 极简策略,避免缓存污染
db.update(key, data) # 只写DB,不碰缓存
# 读操作仍用Cache-Aside
演进路径可视化
↗ Write-Through → Write-Behind (性能演进)
Cache-Aside (起点)
↘ Write-Around (简化分支)
各策略的哲学
| 策略 | 设计哲学 | 适用场景 |
|---|---|---|
| Cache-Aside | "我给你工具,你自己决定怎么用" | 需要精细控制的业务 |
| Read/Write-Through | "你只管用,底层细节我来处理" | 需要代码简洁的业务 |
| Write-Behind | "性能优先,我保证最终会同步" | 高并发写入场景 |
| Write-Around | "简单至上,避免过度设计" | 写多读少的数据 |
浙公网安备 33010602011771号