一、缓存雪崩
概念:当缓存服务器重启或者大量缓存集中在某一时间段失效,这样在失效的时候,所有请求会得不到数据,会去数据库查询,查询数据量巨大,导致系统崩溃
解决方案:
(1)在缓存失效后,通过加锁或者队列控制读数据库写缓存的线程数量。比如对其中某个key只允许一个线程查询数据,让其他线程等待。
(2)不同的key,设置不同的过期时间,让缓存失效的时间点不要集中在一起。
二、缓存穿透
概念:缓存和数据库中都没有的数据,而用户不断地发起请求,并且请求量很大,造成数据库很大的压力。
解决方案:
(1)将查询结果为空的也进行缓存,但是设置缓存时间短一点。
(2)因为请求的参数都是不存在的数据,我们可以使用布隆过滤器Bloomfilter提前进行拦截。
三、缓存击穿
概念:一个存在的key,在缓存过期的那一刻,同时有大量的请求,此时这个key这些请求都会击穿到数据库,造成数据库瞬时请求量大、压力增大。
解决方案:
(1)使用互斥锁
(2)热点数据永不过期,后台定义一个定时任务,专门主动更新缓存数据.比如,一个缓存中的数据过期时间是30分钟,那么每隔29分钟定时刷新数据(将从数据库中查到的数据更新到缓存中).