20210708——Redis缓存穿透和雪崩(十一)

缓存穿透是指查询的数据在缓存和数据库中都不存在,大量请求导致数据库压力增大。解决方案包括使用布隆过滤器预校验请求,以及缓存空对象并设置过期时间。缓存击穿是热点key失效时,高并发访问数据库,可通过设置热点数据不过期或使用分布式锁避免。缓存雪崩是大量缓存同时过期,导致系统崩溃,解决方式包括搭建高可用的Redis集群和实施限流降级策略,预热数据以及分散过期时间。

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

缓存穿透

概念

用户查询一个数据,redis没有,就是缓存无命中,于是向持久层数据库请求查询,发现也没有,查询失败。当很多用户一起查询的时候,持久层数据库压力很大,可能导致崩溃,就是缓存穿透。

解决方案:布隆过滤器

对所有可能查询的数据以hash形式存储,先进行校验,不符合直接丢弃。

解决方案:缓存空对象

当存储层不命中之后,缓存一个空对象,设置一个过期时间,之后在访问这个数据从缓存中获取,保护了后端数据源

但是空对象缓存,占用了资源
对于保持一致性的业务可能会有影响

缓存击穿

击穿是指一个key非常热点,高并发集中对一个点进行访问,在某个瞬间可能key失效了,导致高并发访问数据库。

解决方案:设置热点数据不过期

解决方案:加互斥锁

使用分布式锁,使每一个key同时只有一个线程可以访问后端服务,其他线程没有获取分布式锁的权限,因此只需要等待即可,这种方式将高并发的压力转移到了分布式锁。

缓存雪崩

某一个时间段,缓存集中过期,或者服务器宕机/断网

比如双十二,618把数据放入缓存,那么到了半夜1点,商品的缓存很可能都过期了。那么查询就回到了数据库中,导致崩溃。

解决方案:redis集群高可用

解决方案:限流降级

缓存失效后,还是加锁和队列来控制数据库写缓存的线程数量

解决方案:数据预热

在正式部署之前,把可能出现的数据先预先访问一遍,这样部分大量访问的商品数据就会加载到缓存中,在将发生大并发前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值