Redis 关于缓存穿透、缓存击穿、缓存雪崩及解决方案

缓存穿透

缓存穿透,是指在很短的时间内,大量的请求,去查询Redis服务器都查不到,也就是缓存没有命中,于是向数据持久层发起查询,发现也没有,本次查询失败。大量请求直接访问mysql服务器这样会导致缓存直接穿透,MySQL宕机。

解决方案

  • 1.布隆过滤器

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

对于布隆过滤器,是加在Redis和mysql服务器之间的,将mysql中的数据提前存到布隆过滤器中。

布隆算法:

在这里插入图片描述

在这里插入图片描述

  • 2.当存储层不命中后,即使返回的空对象也将其缓存,同时这是一个过期的时间,之后再访问这个资源就会在缓存中获取,保护了后端数据源。这种方式会存在一些问题:
    • 如果null能被缓存起来,就需要更多的空间来存更多的键(其他的数据也可能会有null值,不法分子使用id=UUID来进行攻击)
    • 即使对空值设置了过期时间,还是会存在缓存层和存储层会有一段时间的窗口不一致,对需要保持一致性的业务有影响。

缓存击穿

很短的时间内,大量的请求,集中访问同一个点,当这个key失效的瞬间,持续的大并发就穿破缓存直接打在mysql服务器上。一般是热点数据。

解决方案

  • 设置热点数据永不过期

    从缓存层面看,没有设置过期时间,所以不会存在key过期后的问题

  • 加互斥锁

    分布式锁:使用分布式锁,保证对于每个key,同时只有一个线程去查询后端服务,其他线程没有获取分布式锁的权限,只需要等待。

缓存雪崩

在某一个时间段,缓存集中过期失效,Redis宕机。

如果是key集中过期,到不是非常致命的,比较致命的缓存雪崩,是缓存服务器直接宕机或断网。

解决方案

  • 限流降级

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

    也可以将一些不必要的服务停掉,来保证核心服务的正常运转。

  • 数据预热

    在正式部署之前,先把可能的的数据预先访问一遍,手动触发加载缓存。不同的key,设置的过期时间不痛,尽量让key的过期时间均匀。

  • 如果是Redis宕机,解决方案是做Redis集群,主从。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于 Redis 缓存穿透击穿雪崩问题,可以采取以下解决方案: 1. 缓存穿透:当请求的数据在缓存中不存在时,会直接访问数据库,如果有恶意攻击者大量请求不存在的数据,会给数据库造成很大压力。解决方案可以是在查询前进行参数校验,比如对请求的参数进行合法性检查,或者使用布隆过滤器等技术来快速判断请求的数据是否存在。 2. 缓存击穿:当某个热点数据过期或被删除时,大量请求同时涌入,导致请求直接访问数据库。为了解决这个问题,可以使用互斥锁(Mutex)或者分布式锁来避免多个请求同时访问数据库。在获取锁之前,首先尝试从缓存获取数据,如果缓存中存在,则直接返回;如果不存在,则获取锁,并从数据库中获取数据并放入缓存,最后释放锁。 3. 缓存雪崩:当缓存中的大量数据同时过期时,会导致大量请求直接访问数据库,给数据库带来巨大压力。为了解决这个问题,可以采取以下措施: - 设置合理的缓存过期时间,使得不同数据的过期时间错开,避免同时失效。 - 使用热点数据预加载,提前将热点数据加载到缓存中,避免同时失效。 - 使用多级缓存架构,将缓存分为多个层级,不同层级的缓存设置不同的过期时间,从而降低缓存失效的风险。 - 引入限流和熔断机制,对请求进行限制,避免大量请求同时访问数据库。 通过以上措施,可以有效地解决 Redis 缓存穿透击穿雪崩问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值