缓存穿透 缓存击穿 缓存雪崩


前言

关于对缓存穿透、缓存击穿和缓存雪崩的一些理解和出现问题的解决办法。
在生产环境中,会因为很多的原因造成访问请求绕过了缓存,都访问数据库持久层,虽然对redis缓存服务器不会造成什么影响,但是数据库的负载(IO)就会增大,使缓存的作用降低。


一、缓存穿透

1.1、理解

缓存穿透指的是查询一个根本不存在的key,缓存层和持久层都不会命中,在工作中处于容错的考虑,如果从持久层查不到数据则不会写入缓存层redis。缓存穿透将导致不存在的数据每一次请求都要到持久层去查询失去了缓存保护后端的意义。缓存穿透的问题可能会让后端存储负载加大,由于很多后端持久层不具备高并发,很可能造成后端存储宕机,通常我们可以在程序中统计调用缓存命中数,如果同一个key的缓存命中率很低,可能就是出现了缓存穿透问题。

1.2、原因

自身业务代码或数据出现问题(set和get的key不一致)。
或者是一些恶意攻击、爬虫造成大量空命中(爬取线上商品数据,超大循环递增商品的id)。

1.3、解决办法

1、办法一:设置缓存空对象

设置缓存空对象指的是持久层没有命中的情况下,对key进行set操作,会存在的两个问题:

1、value值为空,不代表不占用内存空间,空值做了缓存,意味着缓存中存了更多的键,针对这一问题的处理比较有效的办法是对这类型的数据设置一个较短的过期时间,让他自动失效。
2、缓存层和持久层有一段时间数据不一致,可能会对业务有一定的影响,过期时间为N分钟,如果这个时候存储层添加了数据,那么这段时间就会出现缓存层和存储层数据的不一致,这个时候可以利用消息系统或者其他方式清除掉缓存层中的空对象。我们更应该保证的是缓存层和持久层的数据一致性。

2、办法二:采用布隆过滤器拦截

在访问缓存层和存储层之前,将存在的key用过滤器提前保存起来做第一层拦截,在收到一个对key请求的时候,先用布隆过滤器是否存在,如果存在就进入缓存层,我们可以用bitmaps做布隆过滤器,这种做法适用于对数据命中不高,数据相对固定、实时性低的场景。
布隆过滤器的优点是:空间效率和查询时间都远超一般的算法;缺点是有一定的误识别率。

1.4、适用场景

缓存空对象适用场景:数据命中率不高,数据实时性要求高;代码维护简单,数据不一致,需要过多的缓存空间。

布隆过滤器使用场景:数据命中率不高,数据实时性要求低;代码维护复杂,需要缓存少。

二、缓存击穿

2.1、理解

缓存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。这种情况会导致数据库压力瞬间骤增,造成大量请求阻塞,甚至直接挂掉。

2.2、原因

系统中存在有下边两个问题
1、当前key是一个热点key,比如秒杀活动,并发特别大的时候。
2、重建缓存不能在短时间内完成,可能是一个复杂的计算,比如复杂的SQL,多次的IO,多个的依赖,在缓存失效的瞬间有大量并发请求来重建缓存,造成后端负载压力加大。

2.3、解决办法

1、办法一:预先设置热门数据

在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长。

2、办法二:实时调整

现场监控哪些数据热门,实时调整key的过期时长。

3、办法三:使用锁

就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db。

先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX)去set一个mutex key。

当操作返回成功时,再进行load db的操作,并回设缓存,最后删除mutex key。

当操作返回失败,证明有线程在load db,当前线程睡眠一段时间再重试整个get缓存的方法。

三、缓存雪崩

3.1、原因

缓存集中在一段时间内失效,而查询数据量巨大,所有的查询都落在数据库,引起数据库压力过大甚至down机。

3.2、解决办法

我们可以尽量让失效时间点均匀的分步,大多数系统在设计的时候考虑用加锁或者队列的方式保证缓存的单线程写,这样可以避免失效时大量的并发请求落在数据库上。即使某级缓存过期了,也有其他缓存兜底。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值