更新缓存的策略

更新缓存的策略

Redis进阶 - 缓存问题:一致性, 穿击, 穿透, 雪崩, 污染等 | Java 全栈知识体系

缓存更新的套路 | 酷 壳 - CoolShell

更新缓存的策略

策略模式 策略模式 读逻辑 写逻辑 缓存角色 一致性 性能特点 典型案例
旁路缓存策略 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 "简单至上,避免过度设计" 写多读少的数据
posted @ 2025-11-28 17:19  deyang  阅读(7)  评论(0)    收藏  举报