缓存雪崩、缓存击穿、缓存穿透与缓存预热的问题与解决方案

缓存雪崩、缓存击穿、缓存穿透与缓存预热的问题与解决方案

缓存雪崩

问题现象:
数据库崩溃后,应用服务器崩溃,最后redis集群崩溃;即使重启数据库再次被击溃。

问题排查:

  1. 在较短时间,缓存中较多的key集中过期。
  2. 在此期间请求访问过期数据,redis未命中,redis向数据库获取数据。
  3. 数据库同时接收大量请求无法及时处理。
  4. Redis大量请求积压,开始出现超时情况。
  5. 数据库流量激增,数据库崩溃。
  6. 重启后缓存仍无数据可用。
  7. Redis服务器资源被严重占用,Redis服务器崩溃。
  8. Redis集群呈现崩塌,集群瓦解。
  9. 应用服务器无法及时得到数据响应请求,来自客户端的请求数量剧增,应用服务器崩溃。
  10. 应用服务器,redis,数据库全部重启,效果不理想。

方案解决:

架构层面

  1. 更多页面静态化处理。
  2. 构建多级缓存架构。 Nginx缓存+redis缓存+ehcache缓存
  3. 检测MySQL严重耗时业务进行优化。
  4. 灾难预警机制。
  5. 服务限流与降级。

技术层面
  1. LRU与LFU切换(逐出算法层面)。

  2. 数据有效期策略调整。
    根据业务数据有效期进行分类错峰,A类90分钟,B类80分钟,C类70分钟。
    过期时间使用固定时间+随机值形式,稀释集中到期的key的数量。

  3. 定期维护(自动+人工)。
    对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据延时。

总结:缓存雪崩就是瞬间过期数据量过大,导致对数据库服务造成压力。如果能够有效避免过期时间集中,可以有效解决雪崩现象。

缓存击穿

数据库连接量瞬间激增,Redis 无大量 key 过期,Redis 内存平稳、CPU 正常,数据库崩溃。

问题排查:

1.Redis中某个key过期,该key访问量巨大。
2.多个数据请求从服务器直接压倒Redis中,均未命中。
3.Redis在短时间内发起大量对数据库中同一数据的访问。

问题分析:单个 key 高热数据过期。

解决方案:

1.对热点数据预热。
2.监控访问量,对自然流量激增的数据延长过期时间。
3.后台刷新数据。启动定时任务,高峰来临前,刷新数据有效性,确保不丢失。
4.设置二级缓存。设置不同失效时间,确保不丢失。
5.分布式锁,防止被击穿(注意性能瓶颈)。

缓存穿透

系统平稳运行,应用服务器流量随时间增量较大,redis服务器命中率逐渐降低,redis内存平稳,内存无压力。突然redis服务器CPU占用激增,数据库服务器压力激增,数据库崩溃。

问题排查:

redis 中大面积出现未命中。
出现非正常URL访问。

问题分析:

1.获取的数据在数据库中不存在。
2.redis获取到null数据未进行持久化,直接返回。
3.下次此类型数据到达重复上述过程。
4.出现黑客攻击服务器。

解决方案:

1.缓存null。对查询结果为null的数据进行缓存(长期使用,定期清理),设定较短时限。
2.mac地址白名单策略。
3.实时监控 redis 命中率与null数据占比,根据倍数不同,进行黑名单防控。

总结:缓存击穿即访问不存在的数据,跳过合法数据的 redis 的缓存阶段,每次访问数据库,导致数据库服务器压力过大。

缓存预热

前期准备:

1.日常例行统计数据访问记录,统计访问频度较高的热点数据。
2.利用LRU数据删除策略,构建数据暴力队列。

准备工作:

1.将统计结果中的数据分类,根据级别,redis 优先加载级别较高的热点数据。
2.利用分布式多服务器同时进行数据读取,提速数据加载过程。

实施:使用脚本程序进行数据预热。

总结:缓存预热是系统启动前,提前将相关缓存数据直接加载到缓存系统。避免在用户请求时直接查询数据库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值