1.缓存穿透缓存穿透是指查询数据库中一定不存在的数据。我们以往正常使用Redis缓存的流程大致是:1.数据查询先进行缓存查询2.如果数据存在,则直接返回缓存数据3.如果数据不存在,则查询数据库,查询到的数据数据放入缓存4.如果数据库查询数据为空,则不会放入缓存。比如我们数据表中的主键是自增生成的,所有的主键值都大于0。这时候如果用户传入的参数是-1,会发生什么?这个-1是一个不能存在的对象。程序每次都会查询数据库,每次查询都是空的,不会每次都缓存。如果有人恶意攻击,可以利用这个漏洞给数据库造成压力,甚至压垮我们的数据库。为了防止有人利用这个漏洞恶意攻击我们的数据库,我们可以采取以下措施:如果从数据库中查询到的对象为空,那么它也会被放入缓存中。key为用户提交的主键值,值为null,只设置缓存过期时间短,比如设置为60秒。这样下次用户根据这个key去查询redis缓存,就可以查到这个值了(当然这个值是null),从而保护我们的数据库免受攻击。2.缓存雪崩缓存雪崩是指缓存在一定时间内集中过期。在缓存集失效的时间段内,所有的数据访问查询都落在了数据库上,对于数据库来说,会出现周期性的压力峰值。为了避免缓存雪崩,我们可以为缓存数据设置不同的过期时间,防止缓存数据在一定时间内失效。例如,流行的数据(访问频率高的数据)可以缓存更长的时间,冷门的数据可以缓存更长的时间。即使是一些特别流行的数据,也可以设置为永不过期。3、缓存击穿缓存击穿指的是某个key很热(比如双十一期间被抢购的产品数据),不断承载着大并发,大并发都集中在访问这个点上。当这个key失效的瞬间,持续的大并发就会突破缓存,直接向数据库请求,就像在屏障上挖了个洞一样。我们也可以将这些热点数据设置为永不过期来解决缓存击穿的问题。
