缓存的三大经典问题
约 434 字大约 1 分钟
2026-03-06
概述
- 缓存穿透:数据根本不存在(查不到)。
- 缓存击穿:一个极度热门的数据刚好过期(单点突破)。
- 缓存雪崩:一大批数据同时过期,或 Redis 宕机(全面崩溃)。
缓存穿透 (Cache Penetration)
请求根本不存在的对象,由于缓存中没有,就会回源数据库,但是数据库也没有,也就无法被缓存,导致缓存形同虚设,数据库一直被请求。
如何解决缓存穿透:
- 对不存在的对象也做缓存,但是如果黑客一直换参数,就会导致 Redis 的内存暴涨,建议只缓存很短的过期时间
- 布隆过滤器 (Bloom Filter),参考:redis用于布隆过滤器
缓存击穿 (Cache Breakdown)
对于超级热点数据(如突发新闻),如果缓存刚好失效,就会瞬间涌进大量请求到数据库。
如何解决缓存击穿:
- 互斥锁:当第一个请求回源数据库时,后续请求等待,直到 Redis 数据被更新。
- 逻辑过期:对热点数据,Redis设置为永不过期,并根据业务逻辑需要,在后台定期刷新。
缓存雪崩 (Cache Avalanche)
击穿,是一个热点数据失效;而雪崩是成百上千个数据在同一时刻集体失效,或者 Redis 服务器宕机。
解决解决缓存雪崩:
- 打散过期时间
- 使用 一主多从 或者 Redis-cluster 架构
- 限流,当雪崩真的发生,数据库开始告警,直接在网关层限流非核心接口
