Redis系列:缓存击穿.穿透.雪崩(九)

本文介绍了Redis缓存中的热key问题及其解决方案,包括提前分散热key、使用二级缓存等。接着讲解了缓存击穿、穿透和雪崩现象,提出了加锁更新、布隆过滤器、缓存空对象等应对策略,以及如何通过Redis高可用、限流和数据预热等措施防止雪崩。

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

什么是热key吗?热key问题怎么解决?

  • 所谓热key问题就是,突然有几十万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机引发雪崩
    在这里插入图片描述

  • 针对热key的解决方案:
    (1)提前把热key打散到不同的服务器,降低压力
    (2)加入二级缓存,提前加载热key数据到内存中,如果redis宕机,走内存查询

缓存击穿

  • 缓存击穿的概念就是单个key并发访问过高,过期时导致所有请求直接打到db上,这个和热key的问题比较类似,只是说的点在于过期导致请求全部打到DB上
    在这里插入图片描述

  • 解决方案:
    (1)加锁更新,比如请求查询A,发现缓存中没有,对A这个key加锁,同时去数据库查询数据,写入缓存,再返回给用户,这样后面的请求就可以从缓存中拿到数据了
    (2)将过期时间组合写在value中,通过异步的方式不断的刷新过期时间,防止此类现象

缓存穿透

  • 缓存穿透是指查询不存在缓存中的数据,每次请求都会打到DB,就像缓存不存在一样
    在这里插入图片描述
  • 解决方案
    (1)布隆过滤器:布隆过滤器的原理是在你存入数据的时候,会通过散列函数将它映射为一个位数组中的K个点,同时把他们置为1,这样当用户再次来查询A,而A在布隆过滤器值为0,直接返回,就不会产生击穿请求打到DB了。
    但是使用布隆过滤器之后会有一个问题就是误判,因为它本身是一个数组,可能会有多个值落到同一个位置,那么理论上来说只要我们的数组长度够长,误判的概率就会越低,这种问题就根据实际情况来就好了。
    (2)缓存空对象:当db没有命中后,及使返回的空对象也缓存起来,并且设置一个过期时间,后面就会直接取缓存中取,也就不会打到DB上,但是也存在问题,如果空值多了,意味着缓存需要更多的空间来存储这些控制键。

缓存雪崩

  • 当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上,这样可能导致整个系统的崩溃,称为雪崩。雪崩和击穿、热key的问题不太一样的是,他是指大规模的缓存都过期失效了(比如淘宝双11)
    在这里插入图片描述
  • 解决方案:
    (1)redis高可用,多增加一些redis设备,及搭建redis集群
    (2)针对不同key设置不同的过期时间,避免同时过期
    (3)限流,如果redis宕机,可以限流,避免同时刻大量请求打崩DB
    (4)数据预热,在正式访问前,预先访问一边,把一些高频的数据预先写入缓存中
    (5)二级缓存,同热key的方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值