缓存穿透
一个请求来访问某个数据,发现缓存中没有,直接去数据库中访问。此种情况就是穿透。(正常情况下缓存跟数据库中数据都是存在,异常情况下会导致)
一般来说是传递了非法的key导致的
解决方案:
1、增加参数校验,在查找缓存之前就过滤掉那些非法的key值
2、对于非法的key值,在缓存中也设置一个null值
缓存雪崩
因大量的数据在缓存中同一时间内因为过期失效了,与此同时大量的请求到来,发现缓存中没有数据,都奔向数据库,结果导致数据库承受不了大规模的请求处理导致服务崩溃。(当然还有可能是缓存宕机)
解决方案
1、缓存宕机导致,那么就采用集群模式,并设置主从 + 哨兵模式,确保容灾的发生能及时供给提供服务。另外再开启持久化,宕机服务重启之后重新将数据加载出来。
2、数据过期导致,那么就采用在设置数据过期时间每个key添加随机数,确保不会再某一时间,大量的key同时失效。在这针对热数据,可以设置永不过期处理,有更新进行更新处理就可。
补救措施:可采取限流 + 本地缓存进行补救,但是还得看具体情况具体对待。
缓存击穿
因为某个热点key过期了,导致大量对于这个key的访问访问到数据库,数据库在短时间内压力过大。
与缓存雪崩的区别是,雪崩是大批量的key一起过期;缓存击穿是一个key访问很频繁,突然失效。
解决方案
1、设置热点key自动续费过期时间。
2、给数据库设置锁,当一条请求访问的时候,其它请求访问不了,就不会短时间内压力过高了。