缓存雪崩
- 现象:当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。这就是缓存雪崩。
-
产生原因:
- Redis宕机
- 采用了相同的过期时间
-
解决方案:
- 在缓存的建立时,尽量避免大量缓存同时过期。
- 提高数据库的容灾能力,可以使用分库分表,读写分离的策略。
- 为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。
- 使用熔断机制。当流量到达一定的阈值时,就直接返回“系统繁忙”之类的提示,防止数据库宕机。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。
缓存击穿
- 现象:一个热点的 Key,同一时间有大并发集中对其进行访问,突然间这个Key失效了,导致并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。
- 产生原因:key 过期
-
解决方案:
- 在业务允许的前提下,对于热点的key可以设置永不过期。
- 使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。
- 使用熔断机制。当流量到达一定的阈值时,就直接返回“系统繁忙”之类的提示,防止数据库宕机。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。
缓存穿透
- 现象: 需要查询的 key 在 redis 中不存在,直接打在数据库上,就像缓存被“穿透”了一样。
-
产生原因:
- 传进来的key在Redis中是不存在的
- 未设置缓存
-
解决方案:
- 对 key 值做校验,把无效的Key存进Redis中。如果Redis查不到数据,数据库也查不到,我们把这个Key值保存进Redis,设置value="null",当下次再通过这个Key查询时就不需要再查询数据库。这种处理方式存在一定的问题,假如传进来的这个不存在的Key值每次都是随机的,那存进Redis也没有意义。
- 使用布隆过滤器。
- 使用熔断机制。当流量到达一定的阈值时,就直接返回“系统繁忙”之类的提示,防止数据库宕机。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。