redis-cli --retry 3 DEL order:detail:8812
# 失败后落入补偿队列 5 秒后重试
DEL order:detail:8812

订单已经改成已发货,详情页还显示待发货,日志里 DEL 那条命令超时抛异常,旧值一直挂到过期。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,先更新库再删缓存,删这一步既没有重试也没有补偿,网络一抖或者实例刚好切换,旧值就留在缓存里,这段时间读到的全是不一致数据。

这次卡住的地方就在「缓存删除失败补偿」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

处理上按这个顺序:删缓存改成带退避的重试 失败写本地队列补删;再补一层延迟双删 更新后 500 毫秒重删一次;读路径比对版本号 发现版本低的写回直接丢掉。

改完只确认一件事:改完数据库立刻读接口就是新值,过十分钟再看依然一致。

作者 9823189