Redis11_缓存穿透和雪崩

Redis11_缓存穿透和雪崩


在这里插入图片描述
在这里插入图片描述
缓存穿透

用户查询某个数据时,会先在redis缓存中查询,如果缓存没有命中,会去持久层数据库MySQL中查询,如果此时依然没有命中,将返回null,不会写入缓存。

当同时有大量的查询请求在缓存中没有命中,于是都去请求MySQL,给持久层数据库造成了巨大压力,这就是缓存穿透现象

比如某个用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案1:布隆过滤器

布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不合法的请求将丢弃,从而避免了对底层存储系统的压力

解决方案2:缓存空对象

该方案会存在两个问题:

  1. 缓存将需要更多的空间来存储空值
  2. 即使对空值设置了过期时间,还是会存在缓存层与存储层的数据有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响

缓存击穿

指一个key非常热点(微博热搜),在不停地被并发访问,当该key在失效的瞬间,持续的并发就会穿破缓存,直接请求数据库,导致数据库瞬间压力增大

扫描二维码关注公众号,回复: 11712066 查看本文章

解决方案1:设置热点数据永不过期
解决方案2:加互斥锁
在这里插入图片描述
缓存雪崩

在某一时间段内缓存集中过期失效或 Redis 宕机、断网

解决方案1:Redis高可用

多增设几台Redis服务器,防止服务器宕机

解决方案2:限流降级

缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待

解决方案3:数据预热
在正式部署前,先将可能需要大量访问的数据预先访问一遍,使其提前存入缓存

猜你喜欢

转载自blog.csdn.net/BLU_111/article/details/108490012