cache.invalidate(key);
redis.del(key);
channel.publish('cache:invalidate', key);

后台改完价格,Redis 里读到的是新值,其中一台实例连续十分钟返回旧价,重启进程后立刻正常,另外七台一直是新值。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,更新逻辑只删了 Redis,没有通知各实例的本地缓存。失效广播用的是发完就忘的 publish,客户端当时正好重连,这条消息没有补发。

围绕「本地缓存失效广播」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:本地缓存加一个短 TTL 兜底 广播丢了也能自己恢复;广播消息带版本号 消费端发现版本落后就整批清掉;改价后对比各实例返回的价格 确认八台一致。

改完只确认一件事:改价后十秒内八台实例返回同一价格,人为断一次连接也不再出现长时间旧值。

作者 9823189