系统设计 | 应用系统缓存
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
缓存类型与策略概述
本文讨论了缓存的两大类别:非应用缓存和应用缓存。非应用缓存包括CPU缓存、磁盘缓存、数据库缓存、ORM缓存、网关缓存、DNS缓存和CDN缓存,它们通常不侵入业务且对程序员来说较为透明。而应用缓存则包括内存本地缓存、分布式缓存、计算缓存和前端缓存,这些缓存类型更易于程序员控制且与业务紧密相关。
缓存对象颗粒度与更新策略
在后端服务中,可以缓存不同的对象,如API返回对象、领域对象聚合和数据库PO,不同的缓存对象决定了缓存的颗粒度和更新策略。较大颗粒度的缓存对象如API返回对象,命中率低,更新策略难以控制。中等颗粒度的聚合对象缓存效果适中,依赖于聚合根控制失效。小颗粒度的数据库PO可借助ORM框架缓存,易于处理失效策略。
特殊场景下的缓存
除了常规的缓存对象,还有特殊场景,如列表页查询缓存、大key缓存和写缓存。列表页查询通常不做缓存,大key需要拆分,而写缓存在高并发场景中将写操作放入Redis异步写入。
缓存设计注意事项
缓存设计需注意缓存雪崩、击穿和穿透问题。雪崩可以通过熔断和高可用设计及随机偏移过期时间解决;击穿可以通过多套Redis分级或设置热点key永不过期;穿透可以通过返回空对象避免回源数据库。更新策略包括自然过期、主动失效和主动预热。常见的缓存场景有热点数据、高价值数据和大I/O数据。
序列化和代码设计建议
序列化时不推荐使用Java自带序列化,而应采用JSON格式,并在上线后清除缓存重新预热。为了方便缓存,应编写缓存友好代码,分离命令和查询操作、少用魔法以及使用参数表传参。
文章最后提供了参考资料,并鼓励读者在发现内容错误时联系作者领取红包。
想要了解更多内容?