Redis雪崩

怎么发生的?

雪崩概念:在某一个时间段,缓存集中过期失效。

举例说明:

如果所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。这就是我理解的缓存雪崩。 

同一时间大面积失效,那一瞬间Redis跟没有一样,那这个数量级别的请求直接打到数据库几乎是灾难性的,如果打挂的是一个用户服务的库,那其他依赖他的库所有的接口几乎都会报错,如果没做熔断等策略基本上就是瞬间挂一片的节奏,怎么重启用户都会把你打挂,等你能重启的时候,用户早就睡觉去了,并且对产品失去了信心,什么垃圾产品。

如何去处理?

这边推荐两种方案:

第一种缓存过期时间加入随机值

设置缓存过期时间时加上一个随机值,避免缓存在同一时间过期。

<?php
 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379, 60);

//设置过期时间加上一个随机值
$redis->set('goods1', '商品', 60 + mt_rand(1, 60));
$redis->set('goods2', '商品', 60 + mt_rand(1, 60));

第二种双重缓存

设置两个缓存,原始缓存和备用缓存,原始缓存失效时,访问备用缓存,备用缓存失效时间设置长点。

//原始缓存
$redis->set('goods1', '商品', 60);
//设置备用缓存,失效时间设置长点
$redis->set('goods_beifen', '商品', 1800);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis雪崩是指在缓存中大量的数据同时失效或者被清除,导致大量的请求直接打到数据库上,从而引起数据库的压力过大,甚至导致数据库崩溃的情况。以下是一些与Redis雪崩相关的面试题及其答案: 1. 什么是Redis雪崩? 答:Redis雪崩是指在缓存中大量的数据同时失效或者被清除,导致大量的请求直接打到数据库上,从而引起数据库的压力过大,甚至导致数据库崩溃的情况。 2. 如何预防Redis雪崩? 答:预防Redis雪崩可以采取以下措施: - 设置合理的缓存过期时间,避免大量缓存同时失效。 - 使用分布式锁或者互斥锁来控制对缓存的并发访问。 - 设置热点数据永不过期,保证热点数据的可用性。 - 使用多级缓存架构,将请求分散到不同的缓存节点上。 3. 如何应对Redis雪崩发生后的情况? 答:当Redis雪崩发生后,可以采取以下措施: - 使用熔断机制,暂时关闭对数据库的访问,避免数据库压力过大。 - 使用限流机制,控制请求的并发量,避免数据库被过多的请求打垮。 - 使用缓存预热机制,提前将热点数据加载到缓存中,减少对数据库的访问。 4. 什么是缓存穿透?如何预防缓存穿透? 答:缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,每次查询都会直接打到数据库上,从而引起数据库的压力过大。预防缓存穿透可以采取以下措施: - 使用布隆过滤器来判断请求的数据是否存在于缓存中。 - 对于查询不存在的数据,也将其缓存起来,但设置一个较短的过期时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值