redis——缓存雪崩、缓存击穿、缓存穿透
雪崩、击穿、穿透都是因为缓存没有承担请求压力,而导致数据库请求压力增大的结果,只不过“失职”的原因不同
1、缓存雪崩
概念
缓存雪崩是由于大量缓存同时失效,读请求的压力在一瞬间从缓存转移到数据库
缓存失效可能的原因有两个:
- 大量缓存同时过期
- 缓存集群整体崩溃
解决方案
- 针对相同过期时间的数据,对过期时间设置一个较小的随机数
- 在发生雪崩时对该请求进行熔断或降级
- 构建缓存集群高可用
2、缓存击穿
概念
少量热点数据失效,使读请求的压力在一瞬间从缓存转移到数据库
解决方案
- 对于热点数据不设置过期时间
3、缓存穿透
概念
雪崩和击穿是由于缓存失效导致的,而穿透是由于数据问题导致的
导致数据问题的原因有两个:
- 业务层逻辑错误,导致数据丢失,这样数据肯定不会缓存
- 恶意攻击,专门访问不存在的数据
解决方案
- cache null,不存在的数据也缓存空值,虽然缓存里有脏数据但是可以减轻数据库压力
- 使用布隆过滤器判断数据有效性。布隆过滤器是位图,发生写请求时,在数据正常入库的同时,对请求做多次hash和取余,计算出位图的若干位置并置1;接收读请求时,先到位图里判断数据是否存在,再读缓存数据或请求数据库获取数据