Redis 缓存雪崩,击穿,穿透的区别

  • 缓存雪崩

如果所有页面的key失效时间都是12小时,中午12点刷新,0点有个秒杀活动大量用户涌入,假设当时每秒6000个请求,本来缓存在可以扛住每秒5000个请求,但是缓存当时所有的key都失效了,此时所有的请求都落到了db上,此时db扛不住,一批缓存key同时失效,导致请求到db层,这种情况就是缓存雪崩。

缓存雪崩–key全部失效或大面积失效

雪崩如何避免呢?Redis存数据的时候,每个key 失效时间加一个随机值,这样可以保证数据不会在同一时刻大面积失效。

setRedis(Key,value,time + Math.random() * 10000);
  • 缓存穿透

缓存穿透是指缓存和数据库都没有的数据,而用户不断发起请求,比如数据库id都是从1开始自增的,此时用户(攻击者)发起一个id为-1的数据或id特别大不存在的数据,攻击会导致数据库压力过大,而这种穿过缓存的情况,就叫缓存穿透。

缓存穿透

这种可以通过校验非法值,来防止缓存穿透的情况

  • 缓存击穿

缓存击穿与缓存雪崩有点像,但是不一样的是:缓存雪崩是因为大面积的缓存失效,打到db上,而缓存击穿是指某一个key非常热点,在不停地扛着大并发,大并发集中对这一点进行访问,当这个key在失效的瞬间,持续并发,就击穿缓存,直接请求db了。

缓存穿透的预防上面已经说明了,可以在接口层增加校验,比如用户鉴权,参数做校验,不合法的参数直接代码return,比如id基础校验,范围校验等。

缓存击穿如何防呢?可以设置热点数据永不过期,或者加上互斥锁就能搞定了。

缓存击穿的预防