if (user == null) {
cache.put(key, NULL_HOLDER, 60, TimeUnit.SECONDS);
}
// 创建用户后 cache.invalidate(key)
新注册的用户立刻查资料返回 404,客服让等一天再试就正常了,日志里这个 id 一直命中缓存,值是 null。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,查询不存在时把 null 缓存了 24 小时,创建用户后没有删这个 key。空值缓存的 TTL 和正常数据用同一个配置,脏窗口被拉到一天。
这次卡住的地方就在「空值缓存过期」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:空值缓存单独设短 TTL 一到五分钟足够挡穿透;创建成功后显式删除对应 key;记录空值命中率 异常升高时检查是否有大量不存在的 id。
改完只确认一件事:新注册用户创建后立刻能查到资料,空值 key 最多一分钟自动消失。
