🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录
⛳️ 推荐
🛡️ 一、缓存穿透(Cache Penetration)
解决方案
🔥 二、缓存击穿(Cache Breakdown)
解决方案
❄️ 三、缓存雪崩(Cache Avalanche)
解决方案
💎 四、方案选型对比表
⚙️ 五、运维与监控
Redis 缓存穿透、击穿和雪崩是分布式系统中的高频问题,会导致数据库压力剧增甚至服务崩溃。以下是针对三类问题的完整解决方案及实践策略:
🛡️ 一、缓存穿透(Cache Penetration)
问题本质:请求访问不存在的数据(缓存和数据库均无),导致恶意流量直接冲击数据库。
解决方案
布隆过滤器(Bloom Filter)
- 原理:预加载所有合法 Key 到布隆过滤器(基于多个哈希函数的位数组),拦截非法请求。
- 实践:
- 误判率设置:50万数据量下误判率1%仅需约58KB内存。
- 启动时通过 @PostConstruct 初始化过滤器。
- 代码示例: if (!bloomFilter.mightContain(key)) return null; // 直接拦截非法请求
缓存空对象(Null Caching)
- 原理:将查询为空的 Key 缓存为特殊值(如 "NULL"),并设置短TTL(如2~5分钟)。
- 风险:短期数据不一致(如新数据插入后仍返回空值)。
- 代码优化: if (dbData == null) {
redis.set(key, "NULL", 5, TimeUnit.MINUTES); // 空值缓存
}
请求拦截
- 入口层校验参数格式(如ID必须>0)。
- 高频无效请求触发限流或封禁 IP。
🔥 二、缓存击穿(Cache Breakdown)
问题本质:热点 Key 突然失效,瞬时高并发请求压垮数据库。
解决方案
互斥锁(Mutex Lock)
- 原理:缓存失效时,通过锁(本地锁或分布式锁)确保仅一个线程查询数据库。
- 实践:
- 本地锁:synchronized(key.intern()) 细化锁粒度。
- 分布式锁:Redis 的 SETNX 命令实现(需设置锁超时,避免死锁)。
- 代码示例: if (redis.setnx(lockKey, "1", 10, SECONDS)) { // 获取锁
data = db.query(key);
redis.set(key, data);
redis.del(lockKey);
} else {
Thread.sleep(50); // 等待后重试
}
逻辑过期 + 异步刷新
- 原理:缓存永不过期,Value 中存储逻辑过期时间,后台线程异步更新数据。
- 优势:用户无感知,避免击穿风险。
- 代码示例: class CacheData {
Object data;
long expireAt; // 逻辑过期时间戳
}
热点数据永不过期
- 对极高频 Key(如首页商品)不设 TTL,通过定时任务异步更新。
❄️ 三、缓存雪崩(Cache Avalanche)
问题本质:大量 Key 同时失效 或 Redis 集群宕机,请求洪峰压垮数据库。
解决方案
分散过期时间
- 基础 TTL + 随机偏移值(如 60±10分钟),避免集中失效。
- 代码示例: long ttl = 3600 + ThreadLocalRandom.current().nextInt(600); // 随机TTL
多级缓存架构
- 本地缓存(Caffeine/Guava)→ Redis → 数据库,层级缓冲流量。
- 本地缓存作用:即使 Redis 宕机,仍可抵挡部分请求。
高可用与降级
- Redis 集群:Sentinel 或 Cluster 模式自动故障转移。
- 熔断降级:Hystrix/Sentinel 在数据库压力大时返回默认值。
数据预热
- 系统启动时或低峰期预加载热点数据。
- 示例:定时任务刷新次日将过期的数据。
💎 四、方案选型对比表
缓存穿透 | 恶意请求不存在的数据 | 布隆过滤器 + 空值缓存 | 空值TTL宜短(≤5分钟) |
缓存击穿 | 热点Key突然失效 | 互斥锁 + 逻辑过期 | 分布式锁需设置超时 |
缓存雪崩 | 大量Key同时失效/集群故障 | 随机TTL + 多级缓存 + 熔断 | 本地缓存TTL宜短(≤30秒) |
⚙️ 五、运维与监控
通过分层防御(如布隆过滤器拦截穿透 + 互斥锁防击穿 + 多级缓存抗雪崩)可系统性规避风险。实际需结合业务特点组合策略,例如电商大促采用 预热 + 随机TTL + 熔断 组合拳。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
评论前必须登录!
注册