Redis缓存预热&雪崩&击穿&穿透

目录

    1、缓存预热

    2、缓存雪崩

    3、缓存击穿

    4、缓存穿透


    1、缓存预热

    场景:

    服务器启动后迅速宕机

    问题排查:

    1、请求数量较高,大量的请求过来之后都要从缓存中获取数据,但是缓存中又没有,从数据库中查找数据后将数据再存入缓存,造成了短期内对redis的高强度操作

    2、主从之间数据吞吐量较大,数据同步操作频度较高

    解决方案:

    为了防止用户访问的时候Redis中没有数据,所以提前将热点数据保存到Redis里面(通过LRU数据删除策略,可以得到高频数据队列),通过脚本的方式将热点数据提前加入。

    2、缓存雪崩

    场景:

    1、系统平稳运行过程中,忽然数据库连接量激增

    2、应用服务器无法及时处理请求,大量408,500错误页面出现

    3、客户反复刷新页面获取数据,导致请求加剧

    4、数据库崩溃→应用服务器崩溃

    5、重启应用服务器无效→Redis服务器崩溃→Redis集群崩溃

    6、重启数据库后再次被瞬间流量击倒

    问题排查:

    1、在一个较短的时间内,缓存中较多的key集中过期,所有的请求都去访问数据库

    2、数据库同时接收到大量的请求无法及时处理,数据库流量激增,数据库崩溃

    3、Redis大量请求被积压,开始出现超时现象

    4、重启后仍然面对缓存中无数据可用→Redis服务器崩溃→集群瓦解

    5、应用服务器无法及时得到数据响应,来自客户端的请求数量越来越多,应用服务器崩溃

    6、应用服务器,redis,数据库全部重启后,效果仍不理想

    总而言之就是:短时间范围内,大量key集中过期

    解决方案:

    1、LRU与LFU切换,尽量去淘汰访问频度低的数据,访问频度比较低的数据即使淘汰了,也不会造成大量

    2、数据有效期策略调整:

    (1)根据业务数据有效期进行分类错峰

    (2)过期时间使用固定时间+随机值的形式,稀释集中到期的key的数量

    3、超热数据使用永久key,并定期人工维护:对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据的延时

    总结:

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

    3、缓存击穿

    场景:

    1、系统平稳运行过程中,数据库连接量瞬间激增

    2、Redis服务器无大量key过期,Redis内存平稳,无波动,服务器CPU正常

    3、数据库崩溃

    问题排查:

    1、Redis中某个key过期,并且该key访问量巨大

    2、大量数据请求在Redis中均未命中,Redis在短时间内发起了大量对数据库中同一数据的访问

    总而言之就是:单个高热数据key过期

    解决方案:

    1、预先设定:比如购物网站,对热点商品要加大此类key的过期时长

    2、现场调整:监控访问量,对自然流量激增的数据延长过期时间或设置为永久性key

    3、后台刷新数据:启动定时任务,高峰期来临之前,刷新数据有效期,确保不丢失

    4、二级缓存:设置不同的失效时间,保障不会被同时淘汰

    总结:

    缓存击穿就是单个高热数据过期的瞬间,数据访问量较大,未命中redis后,发起了大量对同一数据的数据库访问,对数据库服务器造成压力。应对策略应该在业务数据分析与预防方面进行,配合运行监控测试与即时调整策略。

    4、缓存穿透

    场景:

    1、系统平稳运行过程中,应用服务器流量随时间逐渐增大

    2、Redis服务器命中率随时间逐步降低

    3、Redis内存平稳,内存无压力,但Redis服务器CPU占用激增

    4、数据库服务器压力激增→数据库崩溃

    问题排查:

    1、Redis中出现大面积未命中

    2、出现非正常URL访问,也就是说访问的这个key压根就不存在,Redis中不存在,数据库中也不存在

    问题分析:

    1、获取的数据在数据库中不存在,数据库查询未得到对应的数据

    2、Redis获取到null数据,null数据未进行持久化,直接返回

    3、下次此类数据到达,重复上述过程,大量的请求直接到了数据库

    4、出现缓存穿透一般是出现黑客攻击服务器的情况

    解决方案:

    1、可以在最外层先做一层校验:用户鉴权、数据合法性校验等,例如商品查询中,商品的ID是正整数,则可以直接对非正整数直接过滤等等

    2、缓存null:Redis对查询结果为null的数据进行缓存,但是这种方式效果十分有限,会导致Redis中缓存了无用的null值,占用空间

    3、布隆过滤器

    总结:

    缓存穿透是指访问了不存在的数据,跳过了redis数据缓存阶段,每次都会访问数据库,导致对数据库服务器造成压力。应对策略应该在临时预案防范方面多做文章。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值