缓存穿透:去查询一个数据库和缓存中一定没有的数据.
现象:如果我要查一条id=0或者id=-1的数据,因为缓存中肯定查不到,就会发送sql去访问数据库.同时发送十万条访问,数据库就承受不了这么大的压力就会挂掉.重启数据库,访问一直发送,服务器就会启动不起来.
解决办法:
1.代码判断.
if(id=0 ||id =-1){
//就把传过来的参数当做redis的key,把null或者""当做value,并且设置失效时间,防止以后有数据的时候 也查不出来
}else{
//正常缓存的流程:先去缓存中查数据,缓存中没有数据,就去访问数据库,在数据库查到了之后把数据保存到redis中.
}
2.布隆过滤器.
缓存雪崩:某一个时间段,redis中数据集体全部过期失效.
现象:比如在22点的时候,redis中的数据全部失效了,同时来了十万条访问,因为redis中没有数据了,就会直接访问数据库,因为是同时访问数据库,所以来不及把数据存入redis中,就把所有压力给了数据库.
解决办法:1.在批量往redis中存数据的时候,在设置失效时间的时候在后边加个随机值,保证这些数据不会同时失效.
2.热门的数据可以设置失效时间长一些,冷门的数据设置的失效时间短一些.特别热门的数据可以设置失效时间永不过期.
缓存击穿:在扛着高并发进行对某一个非常热门的key访问的时候,当这个key失效的瞬间,持续的大并发会穿透redis,直接访问数据库.
现象:比如在手机抢购的时候,有上千万的用户在访问,当这个key失效的时候,同时还是有上千万的用户在访问这个数据,此时redis中已经没有这个数据了,所有的访问就会直接去数据库,数据库就会承受不了这么大的压力,会挂掉.就像在Redis中凿出了一个洞一样.
解决办法:把非常热门key的数据的失效时间设置成永不失效.