缓存能解决性能问题,也能制造性能问题。下面这五个坑,是我在几个真实项目里反复见到的。
一、缓存雪崩
大量 key 在同一时刻过期,请求瞬间全部打到数据库。解决办法是给过期时间加随机抖动:
const ttl = 300 + Math.floor(Math.random() * 60);
await redis.set(key, value, { EX: ttl });
二、缓存穿透
查询一个根本不存在的 key,每次都绕过缓存查库。可以用空值缓存或者布隆过滤器兜底。
三、大 key 与热 key
- 单个 String 超过 10KB、Hash 元素超过 5000 个,就要考虑拆分
- 热 key 可以增加本地缓存,减少网络往返
四、更新顺序混乱
推荐「先更新数据库,再删除缓存」,并对删除失败做重试补偿。不要试图用双写保证强一致,代价往往更高。
五、没有监控
命中率、内存使用、慢查询、连接数,这四项指标至少要能看到趋势。没有观测的缓存系统,出问题时只能靠猜。
缓存不是数据库的加速插件,而是一份独立维护的数据副本。