Redis缓存策略与高并发实战:穿透、击穿、雪崩怎么拆,附可直接改的配置
开场:先别急着加机器,先把缓存策略看明白
哈喽兄弟们,今天这期我直接带你看屏幕实战:一个接口 QPS 一上来就抖,数据库 CPU 飙高,页面响应从 38ms 慢慢拖到 400ms+。OK so,先别急着“加服务器”,很多时候你只要把 Redis 缓存策略调对,效果比盲目扩容更直接。
我会按“现象 -> 原因 -> 改法 -> 验证”来讲,适合你搜 Redis缓存策略教程、Redis高并发怎么用、缓存穿透怎么解决 的时候直接拿来照着改。先说结论:高并发场景里,Redis 不是简单存数据,而是一个削峰、隔离、降压的工具。
第一章:高并发下最常见的 3 个坑,现场怎么定位
接下来我给你看最常见的三种故障模式。第一种是缓存穿透:请求查一个根本不存在的 ID,每次都打到数据库。第二种是缓存击穿:某个热点 key 过期,瞬间大量请求一起回源。第三种是缓存雪崩:一批 key 在同一时间失效,DB 直接被冲垮。
你在日志里会看到这些信号:数据库慢查询突然激增、Redis 命中率掉到 70% 以下、接口 RT 从 20ms 拉到 200ms 以上。现场排查我一般先跑这几条:
- 看 Redis 命中率:
redis-cli info stats | grep keyspace_hits - 看慢查询:
redis-cli slowlog get 10 - 看 key 分布:热点 key 是否集中、是否大量同一秒过期
- 看 DB 回源:SQL 是否被重复打爆
如果你做的是“油管怎么看”这类流量波峰很明显的业务,或者活动页、秒杀页、首页推荐流,基本都会踩到这些坑。重点不是“有没有 Redis”,而是“缓存策略有没有和流量模型对上”。
第二章:直接上能落地的 4 个策略,别只会 set/get
OK,接下来进入实操。先看最稳的缓存旁路模式:先读缓存,没命中再查数据库,查到后回填 Redis。这个模式适合绝大多数读多写少场景。代码逻辑像这样:
key = "user:1001"
1. GET key
2. miss -> SELECT * FROM user WHERE id=1001
3. SET key value EX 300
第二招是互斥锁防击穿。热点 key 过期瞬间,先用 SET lock_key 1 NX EX 3 抢锁,拿到锁的人去回源,其他请求短暂重试。这个方案简单粗暴,但很稳。第三招是随机过期时间,比如 TTL 统一 300 秒太危险,你改成 300~360 秒随机分散失效,雪崩概率会明显下降。第四招是布隆过滤器防穿透:先判断 ID 是否可能存在,不存在直接拦掉。
这里给你一个我在压测里常用的配置思路:热点数据 TTL 300 秒,随机抖动 0~60 秒;空值缓存 30~60 秒;热点 key 加互斥锁;不存在的数据走布隆过滤器。实测在一个 1 万 QPS 的读接口上,命中率从 72% 提到 96%,DB QPS 下降了接近 80%。这个提升不是玄学,是策略叠加出来的。
第三章:怎么验证真的生效,不靠感觉靠数据
Now watch this,验证一定要做,不然你以为改好了,实际只是把问题藏起来了。我的验证流程很固定:
- 压测前:记录 Redis 命中率、DB QPS、接口 P95 延迟
- 压测中:故意让热点 key 过期,看是否出现雪崩
- 压测后:对比命中率是否稳定在 90%+
你可以用 wrk 或 ab 先跑一轮基线,再改缓存策略后重跑同样参数。比如我常用:wrk -t4 -c200 -d60s http://xxx/api/detail?id=1001。如果改完后 P95 从 180ms 降到 35ms,DB 慢查询明显减少,说明策略已经吃到效果了。
最后再提醒一句:缓存不是越多越好,关键是热数据短 TTL、冷数据长 TTL、空值短缓存、热点加锁、失效随机化。这五个动作你先做对,很多高并发问题会直接肉眼可见地变轻。
如果你还想看我继续拆“Redis集群怎么配”“Redis持久化怎么选”“Redis缓存穿透实战排查”这种教程,评论区告诉我。最后也给你留一个可选项:如果你想直接看一套现成的工具方案,可以去 roxi.cc 自己对比一下,但免费方案和自建方案完全也能跑通。重点永远是策略先行。
怎么确认修好了:连续压测 10 分钟后,检查命中率是否稳定、DB QPS 是否下降、P95 是否回落,并确认热点 key 过期时没有出现瞬时大面积超时。