1. Http缓存流程图
2. 相关概念描述
1. 浏览器缓存策略
- 浏览器每次发起请求时,先在本地缓存中查找结果以及缓存标识,根据缓存标识来判断是否使用本地缓存。如果缓存有效,则使用本地缓存;否则,则向服务器发起请求并携带缓存标识.
- HTTP缓存都是从第二次请求开始的: 第一次请求资源时,服务器返回资源,并在response header中回传资源的缓存策略; 第二次请求时,浏览器判断这些请求参数,击中强缓存就直接200,否则就把请求参数加到request header头中传
给服务器,看是否击中协商缓存,击中则返回304,否则服务器会返回新的资源.
2. 强缓存
- 强缓存命中则直接读取浏览器本地的资源,在network中显示的是from memory或者from disk
- 控制强制缓存的字段有:Cache-Control(http1.1)和Expires(http1.0)
- Cache-Control的优先级比Expires的优先级高。前者的出现是为了解决Expires在浏览器时间被手动更改导致缓
存判断错误的问题。如果同时存在则使用Cache-control。1. Expires是一个绝对时间,用以表达在这个时间点之前发起请求可以直接从浏览器中读取数据,而无需发起请求
优势:
- HTTP 1.0 产物,可以在HTTP 1.0和1.1中使用,简单易用。
- 以时刻标识失效时间, eg: expires: Sat, 24 Apr 2021 09:48:06 GMT,
缺点:
- 时间是由服务器发送的(UTC),如果服务器时间和客户端时间存在不一致,可能会出现问题
-
2. Cache-control是一个相对时间,用以表达自上次请求正确的资源之后的多少秒的时间段内缓存有效。
Cache-control常用值:
max-age: 即最大有效时间
- must-revalidate: 如果超过了 max-age 的时间,浏览器必须向服务器发送请求,验证资源是否还有效
- public: 浏览器和缓存服务器都可以缓存⻚面信息
- no-cache: 不使用强缓存,需要与服务器验证缓存是否新鲜
- no-store: 真正意义上的“不要缓存”。所有内容都不走缓存,包括强制和对比
优点:
- HTTP 1.1 产物,以时间间隔标识失效时间,解决了Expires服务器和客户端相对时间的问题
- 比Expires多了很多选项设置
缺点:
- 商缓存的状态码由服务器决策返回200或者304
- 协商缓存有 2 组字段(不是两个),控制协商缓存的字段有:Last-Modified/If-Modified-since(http1.0)
和Etag/If-None-match(http1.1)1. 何时使用协商缓存: Cache-control: no-cache, 每次都需要与服务器校验
2. Last-Modified/If-Modified-since(http1.0)
优点:
- 不存在版本问题,每次请求都会去服务器进行校验。服务器对比最后修改时间如果相同则返回304,不同返回
200以及资源内容
缺点:
- 只要资源修改,无论内容是否发生实质性的变化,都会将该资源返回客户端。例如周期性重写,这种情况下该资源包含的数据实际上一样的
- 以时刻作为标识,无法识别一秒内进行多次修改的情况。 如果资源更新的速度是秒以下单位,那么该缓存是不能被使用的,因为它的时间单位最低是秒。
- 某些服务器不能精确的得到文件的最后修改时间。
如果文件是通过服务器动态生成的,那么该方法的更新时间永远是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用
3. Etag/If-None-match(http1.1)
为了解决上述问题,出现了一组新的字段 Etag 和 If-None-Match
优势:可以更加精确的判断资源是否被修改,可以识别一秒内多次修改的情况。
- 不存在版本问题,每次请求都回去服务器进行校验。
缺点:
- 计算ETag值需要性能损耗。
- 分布式服务器存储的情况下,计算ETag的算法如果不一样,会导致浏览器从一台服务器上获得⻚面内容后到另
外一台服务器上进行验证时现ETag不匹配的情况
参考:
HTTP缓存-MDN
《http权威指南》-第六章-缓存