压测时缓存命中率只有 12%,Redis 每秒八万次读,业务写一次不到两秒就过期,等于每次都回源。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,为了防雪崩把 TTL 统一下调成 1 到 2 秒,抖动范围也跟着写死。商品数据几分钟才变一次,这么短的 TTL 把缓存变成了摆设。

「TTL 配置写死」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。改完顺手把文档补一句,省得下次自己重新推一遍。

int ttl = 1800 + ThreadLocalRandom.current().nextInt(180);
redis.setex(key, ttl, value);

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,按数据变更频率定 TTL 商品详情五到三十分钟足够;抖动按基础 TTL 的 10% 算 不要固定秒数;上线前用压测看命中率 低于 80% 就调。

最后用这个标准收尾,同样压测命中率回到 93%,Redis 读 QPS 降到 9000,数据库压力跟着下降。

作者 9823189