Redis的缓存穿透&击穿&雪崩

本文探讨了Redis架构中常见的缓存穿透、击穿及雪崩问题,详细解析了各自的成因与影响,并提出了多种解决方案,包括接口校验、缓存空值、布隆过滤器、设置热点数据永不过期、加分布式锁、redis高可用、限流降级、数据预热和本地缓存等。

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

目录

使用Redis架构的高可用问题

缓存穿透(Redis中查不到)

缓存击穿(量太大,缓存过期)

缓存雪崩


缓存穿透(Redis中查不到)

缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询,这会给持久层数据库造成很大的压力,此时就会出现缓存穿透

缓存穿透的解决方案:

1、接口校验。在正常业务流程中可能会存在少量访问不存在 key 的情况,但是一般不会出现大量的情况,所以这种场景最大的可能性是遭受了非法攻击。可以在最外层先做一层校验:用户鉴权、数据合法性校验等,例如商品查询中,商品的ID是正整数,则可以直接对非正整数直接过滤等等。

2、缓存空值。当访问缓存和DB都没有查询到值时,可以将空值写进缓存,但是设置较短的过期时间,该时间需要根据产品业务特性来设置。

3、布隆过滤器。使用布隆过滤器存储所有可能访问的 key,不存在的 key 直接被过滤,存在的 key 则再进一步查询缓存和数据库

缓存击穿(量太大,缓存过期)

缓存击穿是指一个key非常热点,在不停扛着大并发,大并发集中对这一点进行访问,当这个key失效的瞬间,持续的大并发会击穿缓存,直接请求数据库,就像在屏幕上凿开了一个洞

缓存击穿的两种解决方案

一、设置热点数据永不过期

从缓存层面看,没有设置过期时间,所以不会出现热点key过期后产生的问题

二、加分布式锁

使用分布式锁,保证对于每一个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将将高并发的压力转移到分布式锁,因此对分布式锁的考验很大。

缓存雪崩

缓存雪崩,指在一个时间段内缓存集中过期失效或者Redis宕机的情况 

缓存中的key集中过期倒不是非常致命。比较致命的缓存雪崩是缓存服务器某个节点宕机或断网。因为自然形成的缓存雪崩,一定是在某个时间段集中创建缓存,这个时候,数据库也是可以顶住压力的,无非就是周期性的对数据库产生压力。但缓存服务节点宕机对数据库服务器造成的压力是不可预知的,很有可能瞬间把数据库压垮

缓存雪崩的三种解决方案

一、redis高可用

既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建集群(异地多活更稳妥)

二、限流降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,比如对某个key只允许一个线程查询数据和写缓存,其他线程等待

三、数据预热

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

四、本地缓存

从redis中查询的高频热点数据可以放到浏览器缓存localstorage中,这样既做到了限流又在一定程度上缓解了redis宕机导致的数据库收到大量压力的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值