商品缓存设了 expire key 3600,本意是一分钟刷新一次。价格改完一小时,页面还是旧值。乍看像缓存或者权限的锅,追下去往往不是。
redis-cli set product:42 v EX 60 redis-cli ttl product:42 redis-cli pttl product:42
追下去是这么回事:expire 的单位是秒,pexpire 才是毫秒,很多客户端封装又把 Duration 转成秒。参数名里没有单位,看代码时很容易按分钟理解。
碰到「缓存 TTL 单位」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,统一封装缓存工具 方法名带单位 比如 expireSeconds;配置写成 60s 这种带单位的字符串 启动时解析校验;写入时打印 ttl 和 key 前缀;价格这类数据加主动失效 不依赖过期时间。
验收就看一点,改价后重新写入 页面一分钟内刷新 ttl 从 60 递减到 0。
