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

关于Redis——缓存雪崩、缓存击穿、缓存穿透

缓存雪崩

缓存雪崩是指大量的请求无法在缓存中处理,从而将请求转移到数据库中,导致数据压力倍增。一个Redis实例可以支持万级别的并发请求,而单个数据库只能支持千级别的并发请求。两者处理请求并发能力相差十倍,数据库会由于压力过大而导致雪崩。

原因一:缓存中大量的数据同时过期

一般设置缓存数据会设置缓存时间,在某一时刻,大量的缓存同时过期,此时如果有请求访问这些数据的话,缓存不存在,会将请求转移到数据库,如果这些的请求量比较大的,导致数据库的压力增大,严重会导致数据库崩溃。

在这里插入图片描述

针对大量缓存同时失效带来的雪崩,有两种解决方案。

方案一: 过期时间设置随机值

应该避免给数据设置相同的过期时间,在设置过期时间时,增加一点随机值。

setRedis(key, value, time + Math.random() * 10000);

方案二: 服务降级

在这里插入图片描述

服务降低,比如使用hystrix,是指发生雪崩时,针对不同的数据采取不同的处理方式。

  • 请求数据是非核心数据(比如商品属性),暂时停止从缓存查询数据,直接返回预定信息、空值或者错误值。
  • 请求数据是核心数据(比如商品库存、价格),仍然查询缓存,如果缓存缺失,继续在数据库读取。

原因二: redis 服务挂了

redis服务发生宕机,无法处理请求,这就会导致全部转移到数据库去,发生雪崩。

方案一: 添加服务熔断

服务熔断,就是发生雪崩时,暂停对缓存的访问。等redis服务恢复正常后,再允许访问缓存。
对redis所在的服务器进行指标监控,比如QPS、CPU使用率、内存使用率等,如果发现redis服务宕机,而数据库请求压力倍增,此时可以启动熔断机制,暂停对缓存和数据库的访问,比如使用Hystrix服务熔断。
但是暂停对缓存系统的访问,但是对整个业务系统影响很大,导致很多数据不能查看。为了减少这种影响还有另一个方案:请求限流。

方案二: 请求限流

请求限流,就是限制前端请求每秒请求量,使得数据库能承受前端全部请求。
比如前端允许每秒访问1000次,其中900请求缓存,100次才请求数据库。
一旦发生雪崩,数据库每秒请求激增到1000次,此时启动请求限流,在前端入口只允许每秒请求100次,过多的请求直接拒绝。

在这里插入图片描述

无论使用服务熔断或请求限流都是是发生雪崩后处理,这里还有事先预防的方案。
通过主从节点的方式构建redis集群,如果redis主节点宕机,从节点可以切换成主节点。

缓存击穿

缓存击穿是指,针对某个访问缓存非常频繁,无法在缓存中处理,访问该数据的请求一下子都请求数据库,导致数据库压力倍增。
在这里插入图片描述

方案一:不设置过期时间

对于访问特别频繁的热点数据,就不设置过期时间

方案二:使用互斥锁

如果缓存失效,只有拿到锁才能访问数据库,降低数据库并发访问。

缓存雪崩和缓存击穿的差别在于雪崩是大量的缓存,击穿是单一的缓存。

缓存穿透

缓存穿透是指访问的数据既不在redis缓存中,也不在数据库中,因为数据库也不存在数据,也无法将数据库数据写入缓存中,每次请求都要请求缓存和服务器。不过这样也导致系统性能下降。
缓存穿透会发生如下两种情况:

  • 误操作,删除了缓存和数据的数据。
  • 恶意攻击: 专门访问数据库中不存在的数据。
    在这里插入图片描述

方案一: 缓存空值或缺省值

发生缓存穿透,在redis中缓存一个空值或者实现预选设置好的值(比如0),后续请求查询直接在redis中读取空值或者缺省值。

方案二: 使用布隆过滤器

  • 布隆过滤器由一个初值都为0的bit数组和N个哈希函数组成,可以用来快速判断某个数据是否存在。当数据写入数据库时,布隆过滤器会通过三个操作完成标记:
    • 使用N个hash函数,分别计算这个数据的hash值,得到N个hash值。
    • 把这N个hash值对bit数组的长度取模,得到每个hash值在数组中对位置。
    • 把对应位置设置为1。如果数据不存在,那么就没用使用布隆过滤器标记过数据,那么,bit数组对应的bit位为零。只要bit数组有一个不为1,就表明布隆过滤器就没标记过该数据。
    • 把数据写入数据库时,使用布隆过滤器做标记
    • 当缓存消失后,在去数据库查询之前,通过查询布隆过滤器判断数据是否存在,如果不存在,就不查询数据库。
      还有在请求入库添加检测,把恶意请求(参数不合理、参数非法、参数不存在或者id小于0)直接过滤掉。

总结

缓存雪崩和缓存击穿主要是数据不在缓存上,而缓存穿透是数据既不在缓存上,也不在数据上。

  • 缓存雪崩
    • 给过期时间加上小的随机数
    • 服务降级
    • 服务熔断
    • 请求限流
    • redis 设置主从集群
  • 缓存击穿
    • 不设置过期时间
  • 缓存穿透
    • 入口进行合法性验证
    • 使用空值或者缺省值
    • 使用布隆过滤器快速判断

预防方案

使用服务降低、请求熔断、请求限制会影响用户使用体验,最好使用预防方案。

  • 针对缓存雪崩,合理设置数据过期时间,以及搭建redis主从集群。
  • 针对缓存击穿,不要设置过期时间。
  • 针对缓存穿透,在请求入口做规范校验,以及使用布隆过滤器判断数据是否存在。

https://www.cnblogs.com/jeremylai7/p/15419209.html

缓存穿透缓存击穿缓存雪崩是常见的缓存问题,下面是关于Redis缓存穿透缓存击穿缓存雪崩的介绍: 1. 缓存穿透缓存穿透是指当一个请求查询一个不存在于缓存中的数据时,由于缓存无法命中,请求会直接访问数据库。这种情况下,如果有大量的请求查询不存在的数据,会导致数据库压力过大,影响系统性能。 2. 缓存击穿缓存击穿是指当一个热点数据的缓存过期或失效时,大量的请求同时访问该数据,导致缓存无法命中,请求会直接访问数据库。这种情况下,数据库会承受巨大的压力,可能导致数据库崩溃。 3. 缓存雪崩缓存雪崩是指当缓存中的大量数据同时过期或失效时,大量的请求会直接访问数据库,导致数据库压力剧增,性能下降甚至系统崩溃。缓存雪崩通常是由于缓存服务器故障、缓存设置不合理或者缓存数据过期时间设置不当等原因引起的。 为了避免缓存穿透缓存击穿缓存雪崩问题,可以采取以下措施: - 缓存穿透:可以在应用层对查询的数据进行校验,如果数据不存在,则不进行缓存操作,避免大量无效的请求访问数据库。 - 缓存击穿:可以互斥锁或分布式锁来保护热点数据的问,当缓存失效时,只允许一个请求访问数据库并更新缓存,其他请求等待缓存更新完成后再从缓存中获取数据。 - 缓存雪崩:可以采用多级缓存缓存预热、设置合理的缓存过期时间等策略来避免大量缓存同时失效,保证系统的稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值