← 返回文章

Redis

缓存击穿:一次从现象到防线的复盘

当热点键失效后,请求如何穿透到数据库,以及如何用互斥、预热和过期策略建立分层防线。

描绘缓存失效时钟的蓝灰色封面图
本文目录

缓存击穿的危险不在于“缓存没有命中”本身,而在于热点键失效的瞬间,很多请求会同步把压力传递给下游。

先识别真正的热点

如果一个键平时 QPS 很低,偶发未命中通常只是普通的缓存穿透路径。只有当同一键在短时间内拥有大量并发读请求时,失效窗口才会形成需要专门处理的击穿问题。

让重建动作只有一个执行者

常见的第一道防线是互斥:第一个请求获得重建资格,其他请求短暂等待、返回旧值,或进行有限次数重试。关键不在锁的形式,而在于锁、缓存 TTL 与数据加载时间要有一致的超时预算。

为过期策略留出缓冲

热点数据可以采用逻辑过期:缓存值标记为“需要刷新”,但仍然允许读取旧值,同时异步触发一次更新。这样读路径不会在失效点突然把压力转移到数据库。

用指标验证防线

观察命中率并不够,还要记录热点键的并发重建数、等待时长、数据库回源量和失败比例。只有这些指标同时稳定,才说明缓存真正承担了保护下游的职责。