CodeWalk

Redis缓存穿透、击穿和雪崩及解决方案

作者:我是大山 · 2026-05-30 12:55

请详细解释缓存穿透、缓存击穿和缓存雪崩的含义、区别以及对应的解决方案。什么是布隆过滤器(Bloom Filter)?如何使用布隆过滤器解决缓存穿透?

回答

我是大山

1. 缓存穿透

  • 现象:查询数据库和缓存中都不存在的数据(如恶意请求不断查询ID=-1)
  • 危害:大量请求直接打到数据库,可能导致数据库崩溃
  • 解决方案: a. 缓存空值(null,设置较短的过期时间如30秒) b. 布隆过滤器:请求到达缓存前先使用布隆过滤器判断key是否存在 c. 接口参数校验(如ID必须合法)

2. 缓存击穿

  • 现象:热点key在缓存过期瞬间,大量并发请求同时查询该key
  • 危害:高并发瞬间打到数据库
  • 解决方案: a. 互斥锁:重建缓存时加锁,只允许一个线程访问数据库,其他线程等待 b. 逻辑过期:缓存永不过期(不设置TTL),通过异步线程更新缓存 c. 热点数据提前延长过期时间

3. 缓存雪崩

  • 现象:大量缓存同一时间过期(或Redis宕机),所有请求打到数据库
  • 危害:数据库压力骤增,可能宕机
  • 解决方案: a. 过期时间加随机值(如基础时间+随机1~5分钟) b. 多级缓存(本地缓存+Redis) c. 限流降级(Sentinel/Hystrix) d. Redis高可用(哨兵/集群)

布隆过滤器原理

  • 位图+多个哈希函数,判断一个元素一定不存在(准确率高)或可能存在(有误判)
  • 用所有合法key构建布隆过滤器,请求来时先判断,若不存在直接拒绝