Redis缓存穿透、击穿和雪崩及解决方案
请详细解释缓存穿透、缓存击穿和缓存雪崩的含义、区别以及对应的解决方案。什么是布隆过滤器(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构建布隆过滤器,请求来时先判断,若不存在直接拒绝