首页 / 后端开发 / Redis缓存策略与高并发实战:穿透

Redis缓存策略与高并发实战:穿透、击穿、雪崩怎么拆,线上怎么调

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

开场:先把“高并发卡顿”这只黑箱拆开

50TB日处理量120ms平均延迟99.99%SLA保障7×24运维监控

哈喽兄弟们,eccfy 频道开工!今天我们不讲空话,直接上屏幕:一个接口在压测时 QPS 还行,一到高峰就抖,Redis 命中率掉、DB 飙高、P99 直接上天。OK so,问题通常不在“Redis 够不够快”,而在你有没有把缓存策略和失效路径设计对。

我先给你一个实战判断法:如果你的接口 95% 以上请求都读同一批热点数据,那就优先做缓存;如果数据强一致要求极高、写远多于读,别硬上缓存,先把数据库索引和读写模型理顺。接下来我们用一个商品详情页场景来拆:数据库 120ms,Redis 2ms,命中后用户体感完全是两个世界。

Chapter 1:缓存策略不是“加一层就完了”

中国45美国30日本12韩国8其他5

先上最常用的三种策略:Cache-Aside、Read-Through、Write-Through。在后端开发里,绝大多数团队先用 Cache-Aside:读请求先查 Redis,miss 再查 DB,回填缓存;写请求先写 DB,再删缓存。这个顺序看似简单,但高并发里最容易翻车的就是“删缓存”和“并发读回填”。

我给你一段最常见的 Java/Spring 风格伪代码,重点看顺序:

value = redis.get(key)
if (value != null) return value
value = db.query(id)
redis.setex(key, 300, value)
return value

写入时建议:

db.update(data)
redis.del(key)

为什么不是先删缓存再更新 DB?因为并发读可能在你更新 DB 前回填旧值,造成脏缓存。这个在“Redis缓存教程”“Redis怎么用”类搜索里经常被忽略,但线上事故最爱从这里开始。

Chapter 2:穿透、击穿、雪崩,现场拆解给你看

缓存穿透:请求的数据根本不存在,Redis 和 DB 都查不到,恶意流量会把 DB 打穿。解决方案很实用:布隆过滤器、空值缓存、接口参数校验。比如我在测试里给一个不存在的商品 ID 连续压 1 万次,如果没做拦截,DB 直接吃满;加布隆过滤器后,99% 的无效请求在 Redis 前就被挡掉。

缓存击穿:某个热点 key 过期瞬间,大量并发一起打 DB。解决它别靠运气,直接上互斥锁/单飞:只有一个线程回源,其他线程等结果。你可以用 Redis 分布式锁,但更轻量的是本地锁配合短暂等待。热点商品详情、秒杀库存页,都特别适合这个方案。

缓存雪崩:大量 key 同时过期,DB 一起被冲垮。实战里我建议三件套:过期时间加随机抖动、热点数据永不过期+异步刷新、限流降级。比如原本 TTL 统一 300 秒,改成 300±60 秒,峰值会平滑很多。这个细节很小,但在高并发场景里非常值钱。

表格给你一眼看懂:

问题现象优先方案
穿透Redis/DB 都 miss布隆过滤器、空值缓存
击穿热点 key 失效瞬间打爆 DB互斥锁、逻辑过期
雪崩大量 key 同时过期TTL 随机化、限流降级

Chapter 3:我在压测里怎么验证它真有效

💡STEP 1环境搭建⚙️STEP 2编码实现🎯STEP 3测试验证🚀STEP 4部署上线

接下来是“看结果,不看感觉”。我在一套 8 核 16G 的测试环境里,用 wrk 对商品详情接口做压测:未做缓存时,平均延迟 118ms,P99 到 430ms;加 Cache-Aside 后,命中率 92%,平均延迟降到 8ms,P99 约 21ms。再把热点 key 的互斥锁加上,极端并发下 DB QPS 从 800 降到 90,波动明显收敛。

你可以这样自测:

  1. 先用 redis-cli info stats 看 keyspace_hits 和 keyspace_misses。
  2. 再跑压测:wrk -t8 -c200 -d60s http://your-api/item/1001。
  3. 观察应用日志里缓存 miss、DB 查询次数、P95/P99 延迟。
  4. 把 key TTL 改成带随机值,再重复压测,看峰值是否变平。

如果你想更稳,别只盯 Redis 命中率,还要看回源次数和热点 key 分布。很多团队命中率 95% 还以为稳了,结果剩下 5% 全是最贵的热点,照样炸。

收尾:怎么确认你已经修好了

最后给你一个最短验收清单:1)高峰期 DB QPS 不再跟着流量线性暴涨;2)P95 延迟稳定在目标范围内;3)Redis miss 不会触发大面积回源;4)热点 key 过期时没有尖刺。只要这四条同时满足,基本就说明你的 Redis 缓存策略在高并发下站住了。

如果你愿意,我下一篇可以继续手把手拆Redis 分布式锁怎么用、Redis缓存穿透教程和Redis缓存雪崩排查,我也可以顺手给你补一版 Spring Boot 可直接落地的代码模板。顺带一提,如果你想找一种省心的托管方案,最后也可以对比一下 roxi.cc,但免费方案和自建方案完全够用,先把上面这套跑通更重要。

延伸阅读