I2.12.4no stale default for critical data设计
涉及安全或时效关键的数据不应使用陈旧缓存作为默认呈现
别名: 关键数据禁用陈旧 · 安全数据要最新 · fresh-required
概念解释
有一类数据,旧一拍就会变成错操作或错判断:余额与额度、权限与会话、库存与票、验证码与锁定期、医疗或安全告警。这类数据的默认呈现必须是经过此刻确认的,不能先画缓存再希望标记和静默刷新来补。加速在这里买到的是一次可能不可逆的假世界。时效关键不是「最好新一点」,是「旧的那一帧不准当默认」。
机制
缓存加速的前提是「旧副本被当现在用」的代价可接受。安全与时效把代价改成:按旧余额付款、按旧权限进门、按旧库存下单、按已过期的告警不作为。标记改变的是人知不知道旧,不知道的人会做错,知道的人仍可能来不及等新的就按旧的点了——因为默认已经把可点的世界摆在眼前。静默刷新若在点击之后才把真相送来,真相变成回滚,回滚在钱和权限上比一开始等一轮更贵。
所以这类对象的关键路径上,网络往返(或等价的实时通道)必须挡在第一帧之前,或挡在可点之前。允许的降级是明确的阻塞:「正在确认余额」,而不是一张可点的旧余额。壳和装饰仍可走缓存;被保护的是会改变决策或授权的那些字段。
边界
「关键」要按字段切,不要按整页切。商品详情的文案可以陈旧,价格和可买数量不行;设置页的头像可以陈旧,登录态不行。人明确进入离线,关键数据应改成「无法确认」而不是「显示上次的并让人当现在用」——上次的可以只读查阅,不能带上动作。极短的确认缓存(几百毫秒内刚确认过)可以视为此刻,不必每次按键都打到服务器;这是窗口,不是「长期陈旧默认」。法规要求展示最新费率的场景,产品不能用感知性能当豁免。
怎么落地
- 给字段打「必须新鲜」:余额、权限、库存、票据、告警。这些字段默认不走陈旧先画。
- 它们的控件在确认前不可用;可以展示「正在确认」,不可以展示可点的旧值。
- 同一页里非关键块仍可缓存,避免整页因一个关键字段放弃所有加速。
- 验证:把余额改到服务器、本地缓存留着旧余额。打开付款页。若旧余额先出现且可点,默认就用了陈旧。正确是确认前不可付,确认后是新余额。再试离线:应是无法确认,而不是用旧余额完成支付。