缓存把热点数据放在更近、更快的地方(内存/Redis),用空间换时间。收益是性能,代价是一致性风险:缓存与源数据可能不同步。
好的缓存设计,是在性能与一致性之间找到业务可接受的平衡点。
原则:能缓存高频只读数据,慎缓存强一致数据;先有缓存失效兜底,再谈命中率。
必须防住的高频故障。
查不存在的数据打到数据库。防护:布隆过滤器/空值缓存。
热点 key 失效瞬间并发打库。防护:互斥锁/逻辑过期。
大量 key 同时失效。防护:过期时间加随机、多级缓存。
从识别热点到稳定运行。
分析查询频率与数据特征,找出值得缓存的热点数据。
选缓存层级与 key 结构,设置合理过期时间。
防穿透、击穿、雪崩,加降级与兜底。
选合适的更新策略(先更库后删缓存等),验证一致性。
常见更新策略对比。
| 方案 | 做法 | 特点 |
|---|---|---|
| Cache Aside | 先更库,再删缓存 | 实现简单、主流 |
| Read Through | 缓存负责读库 | 逻辑集中 |
| Write Through | 写时同时写缓存 | 一致性强、延迟高 |
| 延迟双删 | 删缓存后延迟再删 | 进一步降风险 |
用 Cache Aside + 延迟双删降低窗口,必要时引入消息队列保证最终一致。业务上容忍短暂不一致即可。
布隆过滤器拦截不存在 key + 空值短暂缓存,双管齐下,避免恶意或低效查询打库。
按业务冷热定:热点数据长缓存或逻辑过期,普通数据短缓存加随机抖动,避免雪崩。
单机可本地缓存,多实例用 Redis 保证一致。可组合:本地缓存扛热点,Redis 做共享层。