I2.12.1cache speed versus inconsistency设计

缓存内容能加快呈现速度但存在与服务器状态不一致的风险

别名: 缓存换速度 · 与服务器不一致 · stale-by-default speed

概念解释

缓存把曾经到过的内容留在本地,下一次打开先画这份,不等服务器。感知上的第一帧因此可以落进连续思维甚至即时窗口。交换是:本地这份可能已经不是服务器上那份。库存、已读、权限、别人刚改的标题,都可能在缓存里停在旧世界。速度来自跳过网络;不一致来自跳过网络。这条只立交换本身,时效怎么标、怎么静默刷新、什么数据不准走这条捷径,是后面三叶。

机制

呈现速度的下限通常是网络往返。缓存把下限换成磁盘或内存读取,差一到两个数量级。人在这段被省下的时间里开始读、开始点。读到的命题却绑定在「上次成功响应」的时刻,不是「现在」。服务器在这两个时刻之间若改了对象,界面上的命题为假,只是假得很快。不一致不一定立刻被看见:列表看起来完整,缺的是别人刚加的一行;开关看起来开着,服务端已经关了。

缓存还有一层身份:这份是谁的会话留下的。换用户、换权限之后仍画出上一份,不一致从「旧了」升级成「错人」。速度好处在第一帧,错人伤害也在第一帧,所以缓存的加速不是无条件的快,是「在同一身份、同一对象仍被允许用旧副本」这个前提下的快。

边界

只读、很少变、即使旧一拍也无害的内容(静态文案、图标、已发布且不再改的文章)上,不一致风险可以压到忽略,缓存几乎是纯加速。强一致的协作编辑、库存扣减、权限门,加速会直接变成错操作,不能用这条的好处去压过第四叶。离线时缓存不是捷径,是唯一副本,不一致变成「与最后一次在线同步的差」,要按离线那一族处理。缓存命中若仍要先等校验头再画,加速会被校验往返吃掉,变成「有缓存却仍在等」,好处没拿到,还多一层复杂度。

怎么落地

  • 对同一身份下允许旧副本的列表和详情,默认先画缓存,把网络往返从第一帧里拿掉。
  • 换用户、换权限时丢掉上一份缓存,不要用速度去画错人的页。
  • 把「这份可能旧」当成缓存加速的固有成本,在产品账上与省下的毫秒写在一起,而不是只报首屏时间。
  • 验证:改服务器上的一条标题,立刻用未过期的缓存打开。第一帧若是旧标题,加速就发生了——这是这条的正常交换。若第一帧仍转圈等到新标题,缓存没在加速。接下来看后三叶有没有把这次旧讲清楚、有没有把不该旧的数据排除。

延伸

  • 同组I2.12.2 陈旧内容需要有可辨识的时效标记而非等同于最新数据 · I2.12.3 后台静默刷新缓存并在数据变化时提示用户优于强制等待 · I2.12.4 涉及安全或时效关键的数据不应使用陈旧缓存作为默认呈现
  • 相邻I2.04 预取与预加载 · I4.07 实时性等级与一致性预期 · I3.10 离线状态与本地优先
  • 站内检索cache versus freshness · stale while revalidate · inconsistent cache

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/I2.12.1