Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案

本文详细讨论了Redis缓存中的常见问题,包括雪崩、击穿、穿透的含义、原因和解决方案,以及双写一致性、并发竞争的处理办法。此外,还探讨了热点key的重建优化和BigKey的危害及优化措施,旨在提高缓存系统的稳定性和效率。

一. 缓存雪崩

1. 含义

 同一时刻,大量的缓存同时过期失效。

2. 产生原因和后果

(1). 原因:由于开发人员经验不足或失误,大量热点缓存设置了统一的过期时间。

(2). 产生后果:恰逢秒杀高峰,缓存过期,瞬间海量的QPS(每秒查询次数)直接打到DB上,如果系统架构没有熔断机制,直接将导致系统全线崩溃。

3. 处理方案

(1). 设置不同的缓存失效时间,比如可以在缓存过期时间后面加个随机数,这样就避免同一时刻缓存大量过期失效。

setRedis(key,value,time + Math.random() * 9999);

(2). 针对系统的一些热点数据, 可以设置缓存永不过期。 (或者定时更新)

(3). 设置二级缓存架构C1、C2,C1在前,C2在后,C1的缓存可以设置不同的过期时间,C2缓存与DB保持强一致性,实现数据同步。

PS:该二级缓存架构,同样也适用于解决下面的缓存击穿。

(4). 从架构层面来说:Redis做集群,将热点数据分配在不同的master上,减轻单点压力,同时master要对应多个slave,保证高可用; 系统架构要有快速熔断策略,减轻系统的压力。

二. 缓存击穿

1. 含义

 某热点Key扛着大量的并发请求,当key失效的一瞬间,大量的QPS打到DB上,导致系统瘫痪。

PS:缓存击穿和缓存雪崩类似,击穿是某些热点key失效一瞬间大量请求打到DB上,缓存雪崩是指缓存面积失效导致大量请求打到DB上。所以二者的处理方案类似。

2. 处理方案

(1). 热点key过期时间后加随机数 。

(2). 热点key缓存永不过期(但是value需要开个子线程去更新)

(3). 二级缓存架构策略。(详见上面)

(4). 采用互斥锁更新,保证同一进程针对相同的数据不会并发打到DB上,从而减轻DB的压力。

(5). 缓存失效的时候随机sleep一个很短的时间,再次查询,如果失败则执行更新操作。

三. 缓存穿透

1. 含义

 业务请求中数据缓存中没有,DB中也没有,导致类似请求直接跨过缓存,反复在DB中查询,与此同时缓存也不会得到更新。

举个例子:

 商品表中的id是自增,并且以id为缓存的key,商品库存为value事先存在redis中。但此时过来的请求id均为负数,-1,-2,-3

缓存雪崩是指在缓存中大量热点数据同时失效或过期,导致所有请求都打到数据库,造成数据库压力骤增,甚至宕机。这是高并发系统中常见的问题。 --- ### 🧱 缓存雪崩原因 1. **缓存设置了相同的过期时间**,导致大量缓存同时失效; 2. **缓存服务宕机**(如 Redis 宕机),导致所有请求穿透数据库; 3. **大量热点数据被同时删除**; 4. **缓存预热不足**。 --- ### 🛠️ 缓存雪崩解决方案 #### ✅ 1. **设置不同的过期时间** - 在原有过期时间基础上**增加一个随机值**,避免同一时间大量缓存失效。 - 示例(Java): ```java int expireTime = baseExpireTime + new Random().nextInt(300); // 增加0~300秒随机时间 redis.set(key, value, expireTime, TimeUnit.SECONDS); ``` #### ✅ 2. **缓存永不过期(适合热点数据)** - 使用 Redis 的 `EXPIRE` 或 `PEXPIRE` 命令时,**不设置过期时间**,通过后台异步更新缓存; - 或者使用**逻辑过期时间**,在缓存值中保存一个过期时间字段,由业务逻辑判断是否需要更新。 #### ✅ 3. **缓存高可用(Redis Cluster 或哨兵模式)** - 避免单点故障导致缓存服务不可用; - 使用 Redis Cluster 或哨兵模式实现缓存服务的高可用。 #### ✅ 4. **限流降级** - 在缓存失效时,**限制数据库访问频率**,防止数据库崩溃; - 可使用如 Guava RateLimiter、Sentinel、Hystrix 等工具进行限流和降级。 #### ✅ 5. **缓存预热** - 在系统上线或低峰期,**提前将热点数据加载到缓存中**,避免冷启动时大量请求穿透; - 可通过定时任务或脚本实现。 #### ✅ 6. **多级缓存架构** - 使用本地缓存(如 Caffeine)+ 分布式缓存(如 Redis); - 即使 Redis 失效,本地缓存仍可缓解数据库压力。 --- ### ✅ 总结一句话: 缓存雪崩的核心解决思路是**避免大量缓存同时失效、提高缓存服务可用性、合理限流降级、做好缓存预热和多级缓存设计**。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值