知识卡片
ETag与Last-Modified的精度权衡
内容
[[Cache-Control取代Expires解决的三个缺陷]]解决的是”时效性假设”型缓存,但 现实中很少有人能准确承诺资源多久不变。协商缓存换了个思路:不承诺时效, 而是每次都拿一个凭证问服务器”变了没有”,没变就返回304省去消息体。 Last-Modified/If-Modified-Since用资源最后修改时间做凭证,实现简单、开销 小,但精度只到秒级——1秒内多次修改无法区分,或者内容没变但文件被重新 生成导致修改时间变了,都会造成误判。ETag/If-None-Match用资源内容的哈希 值做凭证(如Apache默认对文件INode、大小、修改时间一起做哈希),精度是 HTTP缓存机制里最高的,代价是每次请求服务端都要做一次哈希计算,性能是 最差的。两者并不互斥:服务端通常优先验证ETag,ETag一致时才再比对 Last-Modified,这是为了兜底”某些HTTP服务端没把修改日期纳入哈希范围”这 类实现疏漏。强制缓存和协商缓存也不互斥——强制缓存没过期就直接用,过期 了或被no-cache禁用了,协商缓存接着起作用,是并行工作的两层防线。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第4章"透明多级分流系统"
4.1.2节"协商缓存"(源文件:_epub-src对应OEBPS/Text/chapter38.xhtml)
- 结论依据:原文说明Last-Modified精度只到秒级、可能因文件重新生成而
误判,ETag是一致性最强但性能最差的机制,且ETag与Last-Modified常搭配
使用以兜底哈希范围疏漏,直接支撑本卡片结论。
- 原始内容:ETag是HTTP中一致性最强的缓存机制……ETag也是HTTP中性能最差
的缓存机制,在每次请求时,服务端都必须对资源进行哈希计算……ETag和
Last-Modified是允许一起使用的,服务端会优先验证ETag。