← 返回首页
什么是缓存穿透、缓存击穿、缓存雪崩?如何解决?
缓存穿透 (Penetration)
现象:查询根本不存在的数据,缓存没命中,请求直打数据库,数据库也没数据。恶意攻击可打挂 DB。
解决:
布隆过滤器 (Bloom Filter):拦截不存在的关键字。
缓存空对象:即使 DB 没查到,也在 Redis 存一个 null 值(设短过期时间)。
缓存击穿 (Breakdown)
现象:某个热点 Key 突然过期,此时大量并发请求涌入,直打 DB。
解决:
互斥锁 (Mutex Lock):只让一个线程查 DB 并回写缓存,其他等待。
逻辑过期:Key 不设物理过期时间,而是在 Value 里存一个 expire_time 字段。发现逻辑过期后,异步开启线程重建缓存,当前请求先返回旧数据。
缓存雪崩 (Avalanche)
现象:大量 Key 同时过期,或者 Redis 宕机,导致请求全部涌向 DB。
解决:
随机过期时间:在原过期时间基础上加一个随机值(如 1-5 分钟),避免集体失效。
高可用架构:搭建 Redis 集群(Sentinel 或 Cluster),防止单点宕机。
限流降级:配合 Sentinel/Hystrix/Resilience4j 保护数据库。