一、缓存雪崩
场景
1、redis宕机
2、redis大规模的key失效
解决方式
1、事前:对redis做高可用(哨兵或者cluster)
2、事中:做多级缓存,例如:ehcache做为一级缓存,redis做二级缓存;针对直接走数据库的请求进行限流与降级
3、事后:开启redis持久化,当redis重启后可以快速恢复数据
4、缓存中的key过期时间设置的尽量均匀点,不让其发生同一时间大规模的key失效,或者针对热点数据甚至永不过期
二、缓存穿透
场景
黑客恶意攻击,针对缓存不存在的key和数据库不存在的数据进行高并发访问,导致数据库宕机
解决方式
1、针对id为负数时(一般id都设为自增主键),在接口层就进行过滤
2、当一个请求在缓存和数据库都不存在时,在缓存中进行一个记录(key,null),设置短一点的过期时间。
但是不推荐这样做,可能黑客每次模拟的场景都不一致,这样做法就没有太多意义,反而增加缓存无效数据量;而且这样做针对不存在的key已经在缓存中记录下来了,后续又在数据库中加入了该条数据,就会导致数据的不一致
3、是用布隆过滤器,将缓存和数据库中的条件key或者字典放入布隆过滤器中,当请求过来时先先去过滤器中查询是否存在数据,存在走后续流程,不存在直接返回,起到一个很好的过滤作用
三、缓存击穿
场景
当缓存中某个key失效时,大批量的请求过来发现缓存不存在,就直接去访问了数据库,导致数据库直接宕机
解决方式
1、缓存中针对热点数据设置永不失效
2、使用互斥锁(单体)或者分布式锁(分布式场景下)进行一个加锁,第一个请求查询数据库并将数据放入缓存,最后再释放锁,这样后面的请求就可以直接从缓存中获取