缓存雪崩如何解决?

1 缓存雪崩:

是指在某一个时间段,缓存集中过期失效。产生雪崩的原因之一,比如马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。

在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。

解决办法:

1 )缓存失效时间加入随机因子,尽量让失效时间点均匀分布,设置不同的过期时间

2)可以加锁,保证一个时刻只有一个线程执行写操作。

 

2 缓存穿透:

程序在处理缓存时,一般是先从缓存查询,如果缓存没有这个key获取为null,则会从DB中查询,并设置到缓存中去。

按这种做法,那查询一个一定不存在的数据值,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

解决办法:

如果对应在数据库中的数据都不存在,我们将此key对应的value设置为一个默认的值,比如“NULL”,并设置一个缓存的失效时间。当然这个key的时效比正常的时效要小的多。

 

3 缓存击穿

缓存穿透可以查看    https://mp.youkuaiyun.com/postedit/92973638

 

 

<think>好的,我现在要解决用户的问题:“什么是缓存雪崩?如何解决?”首先,我需要确保自己正确理解缓存雪崩的概念。缓存雪崩通常指大量缓存数据在同一时间过期,导致请求直接打到数据库,引发数据库压力激增甚至崩溃的情况。接下来,我需要思考用户为什么会问这个问题。可能用户正在处理高并发系统,遇到了性能问题,或者在学习缓存相关技术,想了解常见问题及解决方案。 接下来,我需要确认缓存雪崩的原因和影响。除了大量缓存同时失效,还可能包括缓存服务器宕机,或者某些热点数据集中失效。解决策略方面,常见的办法有设置随机过期时间、使用分布式锁、缓存预热、多级缓存架构以及高可用设计等。需要逐一解释这些方法,并给出实际例子,帮助用户理解。 用户可能的深层需求是希望不仅了解定义,还能获得实际应用的解决方案。因此,我需要结构化回答,先定义问题,再分析原因,最后详细讲解解决策略,每个策略都给出具体实现方式或示例,比如随机过期时间的代码片段,或者多级缓存的结构图。 同时,要注意语言的中文表达,避免专业术语过于晦涩,必要时用比喻或类比帮助理解。例如,将缓存雪崩比作突然断电导致交通瘫痪,而解决方案就像错峰出行或备用电源。此外,需检查回答是否符合之前设定的系统级指令,如使用正确的LaTeX格式,但用户这次的问题可能不需要数学公式,所以主要注意段落结构和列表清晰。 最后,确保回答真实可靠,引用常见的解决方案,比如Redis的高可用方案,或数据库的限流措施。可能需要提到具体的技术如哨兵模式、集群模式,或者工具如Hystrix实现熔断。这样用户能根据实际技术栈选择适合的方法。 总结步骤:定义缓存雪崩,分析原因,列出解决策略,每项策略详细说明,举例或技术实现,确保结构清晰,语言通俗,满足用户的实际应用需求。</think>### **缓存雪崩** --- #### **一、定义** **缓存雪崩**指在**短时间内大量缓存数据集中失效**或**缓存服务整体宕机**,导致所有请求直接穿透到数据库,引发数据库压力激增甚至崩溃的现象。 *类比*: - 假设商场(缓存)突然停电,所有顾客(请求)涌入仓库(数据库)抢购,仓库不堪重负而瘫痪。 --- #### **二、原因分析** 1. **缓存集中过期** - 例如:批量设置的缓存采用相同的过期时间(如凌晨统一过期)。 2. **缓存服务故障** - Redis 集群宕机、网络分区等。 3. **热点数据突发失效** - 高并发场景下,某热门商品缓存突然失效,引发瞬时数据库查询洪峰。 --- #### **三、解决策略** ##### **1. 避免缓存集中过期** - **随机化过期时间** - 为每个缓存数据设置基础过期时间 + 随机偏移值,分散失效时间。 - *代码示例*: ```java // 基础过期时间 1 小时 ± 随机 10 分钟 int expireTime = 3600 + (int)(Math.random() * 600); redis.set("key", "value", expireTime); ``` ##### **2. 缓存永不过期 + 异步更新** - **逻辑过期** - 缓存数据不设物理过期时间,但存储逻辑过期时间字段。 - 后台定时任务或请求触发时异步更新缓存。 - *示例*: ```json { "data": "真实数据", "expire_time": 1672500000 // 逻辑过期时间戳 } ``` ##### **3. 熔断与降级** - **服务熔断** - 当数据库压力超过阈值时,暂时拒绝部分请求(如返回默认值或错误页)。 - *工具*:Hystrix、Sentinel。 - **降级策略** - 核心业务优先保障,非核心功能延迟处理或关闭(如关闭个性化推荐)。 ##### **4. 多级缓存架构** - **层级设计**: - 本地缓存(如 Caffeine)→ 分布式缓存(如 Redis)→ 数据库。 - 逐级回源,避免单一缓存层失效导致全量穿透。 - *架构示例*: ``` 请求 → 本地缓存 → Redis 集群 → 数据库 ``` ##### **5. 高可用缓存集群** - **Redis Sentinel/Cluster** - 使用哨兵模式(Sentinel)实现故障自动转移,或集群模式(Cluster)分片存储数据。 - **异地多活** - 跨机房部署缓存节点,避免单点故障引发全局雪崩。 ##### **6. 请求限流与队列** - **限流** - 使用令牌桶或漏桶算法控制数据库查询速率(如每秒最多 1000 次查询)。 - *工具*:Redis + Lua 脚本、Nginx 限流模块。 - **队列缓冲** - 将请求排队串行处理,避免瞬时并发压垮数据库。 --- #### **四、实践案例** - **场景**:电商平台秒杀活动 - **问题**:商品库存缓存同时失效,导致数据库 QPS 飙升至 10 万+。 - **解决方案**: 1. 库存缓存过期时间设置为 `24小时 + 随机10分钟`。 2. 使用本地缓存(Guava Cache)作为第一层防护。 3. 数据库侧配置限流(每秒最多 5000 次查询)。 4. 通过 Sentinel 实现熔断降级(超时阈值 200ms)。 - **结果**:数据库负载下降 80%,未发生雪崩。 --- ### **总结** 缓存雪崩是分布式系统的典型风险,需通过**分散失效时间**、**多级缓存**、**服务降级**及**集群高可用**等组合策略防御。核心目标是**平衡缓存与数据库的负载**,保障系统韧性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值