Home Redis缓存的雪崩、击穿、穿透
Post
Cancel

Redis缓存的雪崩、击穿、穿透

缓存雪崩

缓存雪崩是指在某个时间点,大量的缓存数据同时失效或过期,导致大量的请求直接打到数据库或后端系统,从而造成数据库负载激增,甚至导致数据库宕机或系统崩溃的现象。

  • 合理设置缓存的过期时间:将缓存的过期时间分散设置,避免大量缓存在同一时间过期。可以使用随机时间,或者将过期时间分布在一个时间段内。
  • 实现缓存数据的自动刷新:确保热点数据在即将过期时能够自动刷新,避免数据大规模失效。
  • 多级缓存:使用多级缓存,将热点数据缓存在多个层次,例如内存缓存、分布式缓存,以减轻缓存层的负担。
  • 限流和熔断:实施请求限流和服务熔断,避免大量请求同时打到后端系统。
  • 监控和报警:建立监控系统,实时监测缓存和后端系统的状态,及时发现问题并采取措施。

缓存穿透

缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到数据库,从而压垮数据库。比如客户查询一个根本不存在的东西,首先从Redis中查不到,然后会去数据库中查询,数据库中也查询不到,那么就不会将数据放入到缓存中,后面如果还有类似源源不断的请求,最后都会压到数据库来处理,从而给数据库造成巨大的压力。

  • 业务层校验:用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。
  • 不存在数据设置短过期时间:对于某个查询为空的数据,可以将这个空结果进行Redis缓存,但是设置很短的过期时间,比如30s,可以根据实际业务设定。注意一定不要影响正常业务。
  • 布隆过滤器:可以将查询的数据条件都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力。

缓存击穿

Redis中一个热点key在失效的同时,大量的请求过来,从而会全部到达数据库,压垮数据库。

  • 设置热点数据永不过期:对于某个需要频繁获取的信息,缓存在Redis中,并设置其永不过期。当然这种方式比较粗暴,对于某些业务场景是不适合的。
  • 定时更新:比如这个热点数据的过期时间是1h,那么每到59minutes时,通过定时任务去更新这个热点key,并重新设置其过期时间。
  • 互斥锁:这是解决缓存穿透比较常用的方法。互斥锁简单来说就是在Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则睡眠一段时间(比如100ms)后重试。
This post is licensed under CC BY 4.0 by the author.