Redis雪崩、击穿、穿透

Redis雪崩、击穿、穿透

缓存预热

问题:服务器启动之后,迅速宕机。

排查特征:请求数量多,主从之间数据吞吐较大,数据同步操作频繁。

​ 缓存预热就是系统启动之前,提前将相关的缓存数据直接加载到缓存系统,避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。用户直接查询实现被缓存的缓存数据。

方案

前期准备
  • 日常例行统计数据访问记录,统计访问频度较高的热点数据。
  • 利用LRU数据删除策略,构建数据存留队列。
准备工作
  • 将统计结果中的数据分类,根据级别,Redis优先加载级别较高的热点数据
  • 利用分布式多服务器进行数据读区,提供数据加载过程
实施
  • 使用脚步程序固定出发预热过程
  • 如果条件允许,使用CDN(内容分发网络),效果会更好

缓存雪崩

问题

  • 系统平稳运行过程中,忽然数据库连接激增
  • 应用服务器无法及时处理请求
  • 大量的408、500错误页面出现
  • 客户反复刷新页面获取数据
  • 数据库崩溃
  • 应用服务器崩溃
  • 重启应用服务器无效
  • Redis服务器崩溃
  • Redis集群崩溃
  • 重启数据库之后再次被瞬间流量放倒

短时间内,大量的缓存中key集中过期。导致短周期内redis大量未命中,向数据库请求数据,数据库无法同时处理大量的请求,导致Redis请求被积压并开始出现超时。此时重启并不能解决缓存中没有数据的问题。同时,数据库流量激增,导致数据库崩溃;Redis大量任务积压,资源被严重占用,Redis崩溃;应用服务器无法及时得到响应数据,来自客户的请求激增,应用服务器崩溃。

解决

​ 导致此问题的原因就是短时间内,大量的缓存中key集中过期。所以解决方案可以有以下:

道(思想、原则)
  • 更多的页面静态化处理,尽可能的降低从缓存中取数据的次数
  • 构建多级缓存:Nginx缓存+redis缓存+ehchche缓存
  • 检测数据库中严重耗时的相关业务,并进行优化
  • 限流、降级:短时间牺牲部分用户的体验,限制一部分的请求访问,降低应用服务器压力,待业务稳定之后逐步放开
术(方式、方法)
  • LRU(到期删除)于LFU(按命中次数删除)切换
  • 数据有效期策略:对业务数据进行分类错峰,比如不同类的缓存数据舍得不同长度的过期时间。在同一个类里,过期时间设定为固定时间+随机值的形式,减少集中过期的发生
  • 超热的数据使用永久key

总结

雪崩就是瞬间过期的数据量太大,导致数据库服务器压力激增。如果能有效避免数据集中过期,可以有效避免雪崩的现象。

缓存击穿

问题:Redis中某个key过期,该key的访问量巨大。多个数据请求来到Redis之后,未命中。Redis就会在短时间大量访问数据库中的同一数据。

​ 该问题的原因是,单个key高热,且过期

解决

  • 预先设定:比如电商平台上的促销商品
  • 现场调整:监控访问量,对自然流量激增的数据延长过期时间
  • 刷新数据:启动定时任务,高峰来临之前,属性数据有效期,确保不丢失
  • 二级缓存:设置不同的有效时间,保证相关的key不被同时过期
  • 加锁:分布式锁,防止被击穿,但是要注意锁的性能瓶颈

总结

​ 缓存击穿就是单个高热数据过期的瞬间,数据量访问较大,未命中Redis,对数据库的同一数据发起大量访问,导致数据库服务器压力增大。

缓存穿透

问题:Redis中大面积出现为命中,出现非正常的URL。

​ 数据库中不存在该数据,Redis获取的null也未进行缓存持久化,直接返回。下次类似的请求重复上述过程。黑客采用此方式进行攻击。

解决方案

  • 对查询结果为null对数据进行缓存,设置短期的过期时间(几十秒。临时的应对策略)。
  • 白名单策略:提前预热各种分类数据对应的ID(可使用bitmaps)。加载正常数据的时候,放行。加载异常数据的时候直接拦截(效率偏低)
  • 实施监控:对Redis的命中率进行监控,如果命中率和null比较,超过平时正常业务范围的几十倍,那么启动相应的排出流程,可加入黑名单
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis雪崩击穿穿透是与Redis缓存相关的常见问题。 1. 雪崩:当Redis中的大量缓存同时失效或被清空,导致所有请求都直接落到数据库上,给数据库造成巨大压力,甚至导致宕机的情况。为了避免雪崩,可以采取以下措施: - 设置合理的缓存过期时间,避免大量缓存同时过期。 - 使用分布式锁来保证只有一个线程去更新缓存,其他线程等待缓存更新完成后再读取。 - 引入热点数据预加载策略,提前加载热门数据,减少缓存失效的影响。 2. 击穿:指某个热点数据的缓存过期后,恰好有大量请求同时访问该数据,导致所有请求都直接落到数据库上,给数据库造成压力。为了避免击穿,可以采取以下措施: - 使用互斥锁或分布式锁来保证只有一个线程去查询数据库并更新缓存,其他线程等待缓存更新完成后再读取。 - 在查询数据库前,先判断缓存是否存在,如果不存在则进行加锁查询数据库并更新缓存。 3. 穿透:指查询一个不存在的数据,由于缓存未命中,每次请求都会直接访问数据库,造成数据库压力过大。为了避免穿透,可以采取以下措施: - 对于查询结果为空的情况,也将空对象缓存起来,设置较短的过期时间,避免频繁查询数据库。 - 对于恶意请求或无效请求,可以进行参数校验或限流等处理。 以上是对Redis雪崩击穿穿透的一些常见解决方案,具体的应对策略需要根据实际场景进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值