热点 key 突然过期,瞬间几十个请求一起打数据库,差点把 Postgres 压垮。事后做了几层防护。
方案:
- 互斥锁:缓存 miss 后只让一个请求查库,其它等待(setnx 实现)。
- 逻辑过期:value 里带过期时间,过期后异步刷新,期间返回旧值。
- 热点 key 永不过期,靠后台任务主动刷新。
const lock = await redis.set("lock:k", "1", "NX", "EX", 5);
if (lock) { const v = await db.query(); await redis.set("k", v); }
现在又加了单机本地缓存(两级),彻底稳了。
大家的缓存击穿/穿透/雪崩都怎么防?