跳至主要內容

http cache

ourandream大约 2 分钟front-end

http Cache, 即 http 协议所规定的对同一个 request 的 response 的服用. 本文是对 http cache 的类别和使用的总结.

类型

private cache

用于缓存个人信息 需要指定 head

Cache-Control: private

shared cache

proxy caches

即代理的缓存

managed cache

即可控制的缓存 当多个请求到达一个 shard Cache, 会触发 request collapse, 即把多个请求合成一个 如果需要保持请求个数, 需要设置为 private Cache 默认情况下, http 会尽可能地缓存, 这种情况叫做heuristic caching(启发式缓存) 若想保持最新状态, 可使用如下 header 让 Cache 不可使用

Cache-Control: no-cache

注意是不使用, 依然会保存, 如果想不保存使用 no-store(不推荐) 也可使用 hash 组成文件名来实现(用在可改变 url 的资源上)

管理 cache 状态

状态

fresh, 仍可用 stale, 过时

判断

Max-age header 指定 cache 创建后可经过的最长时间

Expires header 指定 cache 过期的时间, 但实践中证明时间字符串的处理很困难, 故较少使用, 两个同时指定时优先度低 Validation

即通过发出短请求的方式确定 cache 情况, 再决定是否重新请求资源

控制

If-Modified-Since 在某个日期后是否修改

ETag/If-None-Match 某个抽象数字用于判断是否修改(如使用文件 hash), 优先度高

因为 If-Modified-Since 的日期有其他用途, 一般推荐两个都指定

如果需要强制重新验证:

Cache-Control: no-cache

//http1.1下使用如下代替
Cache-Control: max-age=0, must-revalidate

触发

reload

GET / HTTP/1.1
Host: example.com
Cache-Control: max-age=0
If-None-Match: "deadbeef"
If-Modified-Since: Tue, 22 Feb 2022 20:20:20 GMT

force reload 绕过 cache

GET / HTTP/1.1
Host: example.com
Pragma: no-cache
Cache-Control: no-cache

Vary

可用于指定 http header 来区分请求