Redis 主从切换,客户端重连用了 90 秒,这期间改的 12 个商品价格,在三台实例的本地缓存里一直是旧值,直到隔天发版才恢复。乍看像缓存或者权限的锅,追下去往往不是。

onReconnect(() -> localCache.invalidateAll());
// 或读取时比对 Redis 中的 version 字段

追下去是这么回事:pub/sub 不持久化,订阅端断线期间的消息直接丢弃,重连也不会补发。本地缓存没有版本比对,收到下一次更新前一直用旧对象。

「pubsub 失效丢失」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

具体做法是,订阅端重连成功后主动清空本地缓存 全量回源一次;关键 key 带版本号 读的时候和 Redis 里的版本比一下;不要用 pub/sub 传关键失效 改用带消费组的 stream。

验收就看一点,模拟主从切换后,重连 3 秒内本地缓存被清空,12 个商品价格全部回到新值。

作者 9823189