用已有的缓存副本达到提供服务称为 缓存命中(cache hit),其他一些达到缓存的请求可能由于没有副本可用,而被转发给原始服务器。这称为 缓存未命中(cache miss)。由缓存提供服务的请求所占的比例称为缓存命中率 (cache hit rate)。
其基本思想就是在靠近客户端的地方使用小型廉价缓存,然后逐步采用更大,更强的缓存来装载更多的用户共享文档。
可选的对等支持的缓存称为 兄弟缓存(sibling cache)。HTTP 本身不支持兄弟缓存,所以人们基于 HTTP 进行了扩展,例如 英特网缓存协议 (Iternet Cache Protocol, ICP) 和 超文本缓存协议(HyperText Caching Protocol, HTCP)。
Expires
和 Cache-Control
表示文档的过期时间,如果缓存副本处于这个时间段内,则表示缓存副本未过期。Expires
首部是的值是一个绝对时间,例如:Cache-Control
支持多种指令,例如public
private
no-cache
no-store
max-age=<seconds>
s-maxage=<seconds>
max-stale[=<seconds>]
min-fresh=<seconds>
stale-while-revalidate=<seconds>
stale-if-error=<seconds>
must-revalidate
max-age
),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。proxy-revalidate
must-revalidate
作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。immutable
If-None-Match
或 If-Modified-Since
)来检查更新,即使用户显式地刷新页面。no-transform
only-if-cached
在HTTP 1.1
及以上版本中,如果Cache-Control
的值为max-age=<seconds>
或s-maxage=<seconds>
则会忽略Expires
If-None-Match
和 Etag
(组合使用)If-Modified-Since
和 Last-Modified
(组合使用)Etag
,该字段的值为生成的 Hash 值。 当客服端对该文档进行再验证时,在请求头中增加首部 If-None-Match
,首部的值为保存副本的 Etag
的值。 服务器对请求首部中的 If-None-Match
值与文档最新版本的 Hash 值进行比较,如果值相同,则返回 304 相应,如果文档本删除返回 404 相应,如果不相同且没删除则返回 200。 客户端下载新版本的文档,并根据新的响应首部进行文档缓存的处理。例如 Apache 服务器根据文档的 索引节(INode),大小(Size),和最后修改时间(MTime)进行 Hash 计算得到Etag
的值
If-None-Match
和 Etag
不同的是,If-Modified-Since
和 Last-Modified
的值是一个具体的时间点Cache-Control: max-age<Seconds>
也没有 Expires
首部,缓存可以计算出一个最大试探性周期。LM-Factor
是一种常见的试探性过期算法。其根据最后修改日期来估计文档有多易变。不过,如果您想更新或废弃缓存的响应,该怎么办?例如,假定您已告诉访问者将某个 CSS 样式表缓存长达 24 小时 (max-age=86400),但设计人员刚刚提交了一个您希望所有用户都能使用的更新。 您该如何通知拥有现在“已过时”的 CSS 缓存副本的所有访问者更新其缓存?在不更改资源网址的情况下,您做不到。(shopee interview question)