缓存穿透、缓存击穿、缓存雪崩的区别是什么?

目录

缓存穿透、缓存击穿、缓存雪崩

1、缓存穿透

解决方案

2、缓存击穿

解决方案

请求过程

3、缓存雪崩

解决方案

请求过程


缓存穿透、缓存击穿、缓存雪崩

1、缓存穿透

缓存穿透是指当大量请求未命中缓存,直接请求后端数据库(可能是业务代码的缺陷或恶意攻击),而后端数据库也未能查询到相应记录,从而无法添加缓存。这会导致流量持续打到存储层,无法有效利用缓存,同时给存储层带来巨大压力。

解决方案
  1. 添加空对象到缓存:当请求未命中缓存且数据库记录为空时,可以在缓存中添加该 key 的空对象,并设置过期时间。
    缺点:可能导致缓存中存在大量空值键,例如在遭受恶意攻击或爬虫时。此外,缓存层与存储层的数据在短期内可能不一致。

  2. 使用布隆过滤器:在缓存层前使用布隆过滤器拦截非法请求,并自动将空值添加到黑名单。同时,需要考虑布隆过滤器的维护(可以选择离线生成或实时生成)。

2、缓存击穿

缓存击穿是指某个热点数据在缓存中失效,导致大量并发请求直接访问后端数据库。由于该数据的高访问频率,可能会造成数据库瞬时负载过高,甚至崩溃。

解决方案
  1. 加锁机制:在数据未命中缓存时,使用分布式锁(如 Redis 的 SETNX 或 Zookeeper)来确保只有一个请求可以查询数据库并更新缓存。其他请求在等待期间可以返回默认值或进行降级处理。

  2. 预加热缓存:在数据即将到期前主动更新缓存,确保热点数据始终在缓存中,减少请求直接落到数据库的风险。

  3. 设置合理的过期时间:对于热点数据,可以设置较长的过期时间,减少频繁的缓存失效情况。

  4. 使用互斥锁:在请求过程中引入互斥锁机制,确保只有一个请求能访问数据库,其他请求等待该请求完成后再获取缓存。

请求过程

        1.用户请求访问缓存,如果未命中,则通过分布式锁机制确保只有一个请求可以查询数据库。
        2.查询完成后,将数据更新到缓存,并释放锁,其他请求可以从缓存中获取数据。
        3.在锁的等待期间,其他请求可以返回默认值或进行降级处理,降低数据库的压力。

3、缓存雪崩

缓存雪崩是指大量缓存数据过期,大量请求直接落到数据库上,可能导致数据库承受大量并发请求而崩溃。如果只重启数据库,或者因为缓存重启后没有数据,新流量再次涌入,很快会再次击垮数据库。

解决方案

        1.事前:确保 Redis 高可用(主从 + 哨兵,Redis Cluster),以避免全盘崩溃。
        2.事中:使用本地 ehcache 缓存结合 Hystrix 进行限流和降级,避免数据库承受过多压力。
        3.事后:启用 Redis 持久化,一旦重启,自动从磁盘加载数据,以快速恢复缓存数据。

请求过程

        1.用户请求首先访问本地缓存,若未命中则访问 Redis;如果本地缓存和 Redis 均未命中,则查询数据库,并将数据添加到本地缓存和 Redis。
        2.由于设置了限流,超出请求的部分将在一定时间范围内被降级处理(例如返回默认值或给出友好的提示)。

<think>好的,用户想了解缓存穿透缓存击穿缓存雪崩的定义、区别解决方案。首先,我需要回忆这三个概念的基本定义。根据引用[3],缓存穿透是查询不存在的数据,绕过缓存直接访问数据库;缓存击穿是热点key过期后大量请求直达数据库;缓存雪崩是大量key同时失效或Redis宕机导致数据库压力骤增。 接下来要区分它们的区别。根据引用[1][4],缓存击穿可以视为缓存雪崩的子集,但前者是单个或少量热点key失效,后者是大量key同时失效。而缓存穿透则是查询不存在的数据,无论key是否存在。需要明确这三者的不同场景影响范围。 解决方案方面,缓存穿透通常用布隆过滤器或空值缓存,引用[2][5]提到这些方法。缓存击穿可以用互斥锁或逻辑过期,引用[5]还提到多级缓存缓存雪崩则需要随机TTL、集群部署降级策略,引用[5]详细说明了这些方法。 需要确保回答结构清晰,先分别解释每个问题的定义解决方法,再对比区别。同时注意使用正确的中文表达LaTeX格式,比如变量用$...$,如TTL。还要检查引用标识是否正确对应,避免混淆。最后生成相关问题,帮助用户深入理解。</think>### 缓存穿透缓存击穿缓存雪崩详解 #### 1. **缓存穿透** **定义**:查询数据库中**不存在的数据**(如无效ID),导致请求绕过缓存直接访问数据库。若恶意攻击者频繁发起此类请求,数据库压力剧增[^2][^3]。 **解决方案**: - **布隆过滤器**:预先存储所有合法key的哈希值,拦截无效请求(例如:$H(key) \rightarrow \text{位数组}$)。 - **空值缓存**:对无效查询结果缓存短时间(如$5\text{min}$),减少重复穿透[^5]。 - **请求校验**:在业务层过滤明显非法的参数(如负数的ID)。 --- #### 2. **缓存击穿** **定义**:**热点key过期瞬间**,大量并发请求直达数据库,导致数据库瞬时压力过大[^1][^4]。 **解决方案**: - **互斥锁(Mutex Lock)**:仅允许一个线程重建缓存,其他线程等待(例如使用Redis的`SETNX`命令)。 - **逻辑过期**:缓存数据中存储逻辑过期时间,异步更新缓存(例如:$t_{\text{expire}} = t_{\text{current}} + 300$)。 - **永不过期策略**:后台定时更新热点key,避免自动失效[^5]。 --- #### 3. **缓存雪崩** **定义**:**大量key同时失效**或Redis服务宕机,导致请求全部涌向数据库,可能引发级联故障。 **解决方案**: - **随机TTL**:为不同key设置差异化的过期时间(例如:$TTL = \text{基础值} + \text{随机数}$)[^5]。 - **Redis集群与哨兵模式**:通过高可用架构避免单点故障(如主从切换)。 - **多级缓存**:结合本地缓存(如JVM堆缓存)、Nginx缓存等分散压力。 - **降级限流**:在数据库压力过大时,暂时拒绝部分非核心请求。 --- ### 三者的区别 | 问题类型 | 触发条件 | 影响范围 | 核心特征 | |----------|----------------------------|------------------|-----------------------| | 穿透 | 查询不存在的数据 | 单个或少量key | 绕过缓存 | | 击穿 | 热点key过期 | 单个热点key | 瞬时高并发 | | 雪崩 | 大量key失效/Redis宕机 | 全局或大量key | 系统级压力 | --- ### 关联与扩展 - **缓存击穿雪崩的子集**:若多个热点key同时失效,可能演变为雪崩。 - **防御组合策略**:实际场景中常综合使用布隆过滤器、多级缓存随机TTL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值