缓存雪崩、缓存穿透、缓存击穿
缓存雪崩
某一个时刻出现大规模的缓存失效的情况,导致大量的请求直接打在数据库上,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。
解决方案:
1、在原有的失效时间上加上一个随机值,比如1-5分钟随机。这样就避免了因为采用相同的过期时间导致的缓存雪崩;也可以采用多级缓存
2、给业务降级限流,使用熔断机制。
当流量到达一定的阈值时,就直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。
3、提高数据库的容灾能力,可以使用分库分表,读写分离的策略。
4、为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。
缓存穿透
指客户端请求一个不存在的目标,这样请求永远会打到数据库
解决方案
缓存空对象
- 优点:实现简单,维护方便
- 缺点
- 额外的内存消耗
- 短期的不一致
布隆过滤
- 优点:内存占用少,没有多余key
- 缺点:
- 实现复杂
- 存在误判可能
缓存击穿
缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,高并发同时尝试重建缓存(查表),导致并发全部打在数据库上,导致数据库压力剧增。
解决方案
1、逻辑过期,在value中设置过期时间
2、使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。
参考:
- 什么是缓存雪崩、缓存击穿、缓存穿透?
- 黑马程序员-Redis