Redis缓存策略与高并发实战:穿透、击穿、雪崩怎么拆,线上怎么调
开场:先把“高并发卡顿”这只黑箱拆开
哈喽兄弟们,eccfy 频道开工!今天我们不讲空话,直接上屏幕:一个接口在压测时 QPS 还行,一到高峰就抖,Redis 命中率掉、DB 飙高、P99 直接上天。OK so,问题通常不在“Redis 够不够快”,而在你有没有把缓存策略和失效路径设计对。
我先给你一个实战判断法:如果你的接口 95% 以上请求都读同一批热点数据,那就优先做缓存;如果数据强一致要求极高、写远多于读,别硬上缓存,先把数据库索引和读写模型理顺。接下来我们用一个商品详情页场景来拆:数据库 120ms,Redis 2ms,命中后用户体感完全是两个世界。
Chapter 1:缓存策略不是“加一层就完了”
先上最常用的三种策略:Cache-Aside、Read-Through、Write-Through。在后端开发里,绝大多数团队先用 Cache-Aside:读请求先查 Redis,miss 再查 DB,回填缓存;写请求先写 DB,再删缓存。这个顺序看似简单,但高并发里最容易翻车的就是“删缓存”和“并发读回填”。
我给你一段最常见的 Java/Spring 风格伪代码,重点看顺序:
value = redis.get(key)if (value != null) return valuevalue = 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:我在压测里怎么验证它真有效
接下来是“看结果,不看感觉”。我在一套 8 核 16G 的测试环境里,用 wrk 对商品详情接口做压测:未做缓存时,平均延迟 118ms,P99 到 430ms;加 Cache-Aside 后,命中率 92%,平均延迟降到 8ms,P99 约 21ms。再把热点 key 的互斥锁加上,极端并发下 DB QPS 从 800 降到 90,波动明显收敛。
你可以这样自测:
- 先用
redis-cli info stats看keyspace_hits和keyspace_misses。 - 再跑压测:
wrk -t8 -c200 -d60s http://your-api/item/1001。 - 观察应用日志里缓存 miss、DB 查询次数、P95/P99 延迟。
- 把 key TTL 改成带随机值,再重复压测,看峰值是否变平。
如果你想更稳,别只盯 Redis 命中率,还要看回源次数和热点 key 分布。很多团队命中率 95% 还以为稳了,结果剩下 5% 全是最贵的热点,照样炸。
收尾:怎么确认你已经修好了
最后给你一个最短验收清单:1)高峰期 DB QPS 不再跟着流量线性暴涨;2)P95 延迟稳定在目标范围内;3)Redis miss 不会触发大面积回源;4)热点 key 过期时没有尖刺。只要这四条同时满足,基本就说明你的 Redis 缓存策略在高并发下站住了。
如果你愿意,我下一篇可以继续手把手拆Redis 分布式锁怎么用、Redis缓存穿透教程和Redis缓存雪崩排查,我也可以顺手给你补一版 Spring Boot 可直接落地的代码模板。顺带一提,如果你想找一种省心的托管方案,最后也可以对比一下 roxi.cc,但免费方案和自建方案完全够用,先把上面这套跑通更重要。