线上突然收到一连串告警:

| 步骤 | 操作 | 发现 |
|---|---|---|
| 1 | redis-cli INFO memory | used_memory_rss 从 12GB 跳到了 28GB |
| 2 | MEMORY STATS | volatile-ttl 类内存占比极低,说明大部分 key 没有设置过期时间 |
| 3 | SLOWLOG GET 100 | 大量 KEYS session 和 HGETALL 大 key 操作 |
| 4 | INFO keyspace | 某个 db 里 key 数量 8000万+,几乎是上周的 10 倍 |
| 5 | 查发布记录 | 3 天前新上线了一个功能,把用户 session 缓存到了 Redis |
罪魁祸首浮出水面:新上线的 session 缓存逻辑。
新功能的伪代码:
redis.set("session:" + userId, sessionData)忘了写 EX(过期时间)。
加上当天正好有一波运营活动流量,短短 3 天积累了近 8000 万个永久有效的 session key。Redis 的 maxmemory-policy 配置的是 noeviction(不淘汰),内存满了之后直接拒绝所有写请求 → 连锁反应导致读也阻塞 → 服务超时 → 雪崩。
一句话总结:忘记设置 TTL 的缓存 = 内存泄露炸弹。
Redis 的内存问题极少来自一个"超级大 key",更多是"千万个小 key 的沉默堆积"。
三个核心教训: