缓存是性能的银弹,一致性是缓存的宿命。但凡用过缓存的系统,都被「数据库改了、缓存还是旧值」支配过。这篇把缓存一致性的方案按演进顺序排开——从非常朴素的用到今天的多级防线,重点讲每层方案防什么、防不住什么。
阶段一:先说非常常用的两个姿势的对与错
先更新数据库再删缓存(Cache-Aside):主流默认方案。优点是简单、多数场景够用;漏洞是「删了缓存之后、下一次加载之前」的窗口期读旧值,以及删除失败时的永久不一致(解法:删除重试队列)。
先删缓存再更新数据库:看似对称,实则有并发陷阱——删除后、数据库更新前,另一个请求把旧值又加载进缓存,之后数据库更新完成,缓存里那份旧值成了孤儿。这个方案只适合写多读少且能容忍分钟级不一致的场景。
结论:没有一劳永逸的方案,只有明确的不一致窗口 + 补偿机制。
阶段二:缩短窗口的三个手段
阶段三:强一致需求的另起炉灶
以上都是「非常终一致」。业务真的要求强一致(库存扣减、余额)时,正确答案不是把缓存修到强一致(等于放弃缓存的性能意义),而是架构分流:
把「哪些数据必须强一致」圈出来(通常不到 5%),剩下 95% 用非常终一致——这个分类决策比任何缓存技巧都重要。
阶段四:多级缓存的防线叠加
现代系统的缓存通常不止一层(本地缓存 → 分布式缓存 → 数据库),一致性要每层都设防:
观测:不一致是会被度量的
埋一个「数据版本比对」探针:抽样比对缓存值和数据库值的时间戳,不一致率做成分位数指标。没有这个指标,缓存健康度全靠用户投诉反馈;有了它,方案演进的效果可量化。
总结成一张决策表
缓存一致性这个话题的尽头不是「消灭不一致」,是「把不一致管理在业务无感的范围内」——工程的美感从来在于恰好够用。
(服务端工程系列:网关限流 → 熔断降级 → 配置治理 → 灰度闭环 → 本文:缓存一致性)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。