Redis 缓存穿透、雪崩、击穿

文章讲述了缓存系统中常见的三种问题——缓存穿透、缓存击穿和缓存雪崩,以及相应的解决方案。缓存穿透可通过布隆过滤器预先过滤无效请求,缓存击穿可采用热点数据永不过期或分布式锁策略,而缓存雪崩则建议使用高可用的Redis集群、限流降级或数据预热来防止存储层压力过大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存穿透

(都查不到【redis和数据库的数据】)
在这里插入图片描述
查询的数据对应的数据在数据源并不存在,每次针对此这个数据的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。
若黑客利用此漏洞进行攻击可能压垮数据库,同时互联网项目瞬间高并发(活动、秒杀等)也会直接压垮数据库,这就是缓存穿透。

两种解决方案

解决方案1 - 布隆过滤器
布隆过滤器,英文叫BloomFilter,可以说是一个二进制向量和一系列随机映射函数实现。 可以用于检索一个元素是否在一个集合中,实现原理bitmaps,那么我们就可以在查询之前进行校验,不符合就丢弃或者其他处理,避免了对于服务器的压力。
在这里插入图片描述
解决方案2 - 缓存空对象
当存储层查询不命中的时候,如果MySQL返回空,那么我们也将这个空对象放进缓存中,这样其他认再查询的时候就直接从缓存中读取空对象,从而减轻底层数据库压力。
这种方式有弊端:缓存空值也会占缓存空间,并且缓存了空值的同时可能造成缓存和存储层数据不一致的情况(缓存有空值,持久层有了),会有业务一致性的影响。

在这里插入图片描述

缓存击穿

(redis数据过期的瞬间查太多)
在这里插入图片描述

解决方案

方案一
#设置热点数据永不过期 — 更推荐 尽量热点数据过期时间长一点。
方案二:
使用分布式锁,保证每一个key只有一个线程去数据库中查询数据,其他没有分布式锁权限的线程等待,这种方式将高并发的压力转移到了分布式锁上,因此对于锁的考验也很大。

缓存雪崩

(数据集中失效)
在这里插入图片描述
雪崩就是指缓存中的数据集中过期失效 (或集群宕机–扫地的又把我服务器的电源踢掉了 | 服务器节点宕机 |服务器断网)。
产生雪崩的原因:
比如马上双12了0点,大家准备好了抢购商品,这波商品集中放进缓存中,假设设定的时间为1小时,那么到了凌晨1点的时候,这批商品的缓存就过期了
而对这批商品的查询就落到了数据库上,对于数据库而言,就会产生后周期性的压力波峰,存储层的调用也会暴增,也会造成数据库挂掉,这种现象叫缓存雪崩现象。

解决方案

方案一:
redis高可用--------->既然可能出现redis挂掉问题,那我就多设几台redis,这样一台挂掉其他依然可以使用,这就是我们上面的redis集群。
方案二:
限流降级(分布锁同理 | 队列)------->在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,比如某一个key只允许有一个key线程查询和写缓存,其他线程等待。
方案三:
数据预热--------> 数据预热含义就是再正式部署之前,先将可能高并发的数据查询一遍,写入到缓存中,这样部分可能大量访问的数据就会加载到缓存中
然后设计不同的过期时间,让缓存失效均匀点,避免雪崩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值