后端、接口与数据 · 进阶

缓存:加速但不提供过期数据

一句话: 在加缓存之前,先决定一份过期的数据在多长时间内仍然可以接受——这是唯一真正重要的问题。

放在哪里

浏览器里、分发网络里、应用服务器里,以及一个共享的键值存储里。每一层都更快,也更难失效。大部分痛苦来自一层层堆起来、却没有单一策略来裁决的缓存。

三种策略

按时间过期。简单,对大多数场景够用。会变的数据设短时间,稳定的数据设一个合理的时间。

按事件失效。写入时删掉对应的键。更精确,但需要记住每一个会写入的地方。

后台刷新。先返回已有副本,同时并行刷新——体验很顺滑,代价是值可能稍旧一点。

缓存键里没包含用户身份或权限——于是一个人的数据被返回给了另一个人。同一时刻的大规模集中过期,把数据库压垮。以及一个掩盖了慢查询、而不是修好它的缓存。

深入一层

既要度量缓存命中率,也要度量没有缓存时的响应时间。一个掩盖问题而不是解决问题的缓存,会在最糟糕的时刻爆掉——就是它被清空、系统暴露在它从未被测试过的完整负载之下的时候。