fat-cat

HTTP 缓存

HTTP 缓存分为强缓存和协商缓存

[TOC]

强缓存

header 属性 可选值 优先级 优选点
Pragma(HTTP/1.0) no-cache: 不直接使用缓存,根据新鲜度来使用缓存 1.响应头不支持这个属性
2.为了兼容 HTTP/1.0 的客户端
3.在 HTTP 1.1 中已被废弃
Cache-Control(HTTP/1.1) 1.no-cache: 不直接使用缓存,根据新鲜度来使用缓存
2.no-store: 不使用缓存,每次都是请求下载新资源
3.max-age: xx 秒, 缓存时长
4.public/private: 是否只能被单个用户使用,默认为 private
5.must-revalidate: 每次访问需要缓存校验
1.请求头和响应头都支持这个属性
2.不适用于 HTTP/1.0
3.在缓存未失效前,获取不到修改后的资源
Expires(HTTP/1.0+) GMT 时间( Sat, 19 May 2018 17:17:24 GMT) 1.服务器和客户端的时间不一致会出问题
2.适用于 HTTP/1.0 和 HTTP1.1
3.在缓存未失效前,获取不到修改后的资源

缓存校验有:Expires,Last-Modified,E-Tag

chrome 浏览器中返回的 200 状态会有两种状态:

协商缓存

当第一次请求时,服务器返回的响应头中没有 Cache-Control 和 Expires 或者 Cache-Control 和 Expires 过期,再或者不走强缓存,那么浏览器第二次请求时就会与服务器进行协商,与服务器端对比判断资源是否进行了修改更新。

跟协商缓存相关的 header 头属性有 ETag/If-None-Match、Last-Modified/If-Modified-Since 响应头和请求头需要成对出现

header 属性 可选值 优先级 优选点
If-None-Match / ETag 校验值(一般为一个 hash 值) 1.默认使用 hash 算法,在分布式环境中可能出现不同服务器生成的 ETag 值不一致
2.计算 ETag 需要性能消耗
3.精确的判断资源有无被修改,可识别一秒内的修改次数
If-Modified-Since/Last-Modified GMT 时间 1.只要资源修改,无论内容有无变化,都会将资源返回客户端
2.以时刻为标识,无法获取一秒内的修改变化
3.某些服务器不能准确获取最后的修改时间

使用 HTTP 缓存的好处

HTTP 缓存的注意点