协商缓存(从本地磁盘读取资源副本)
通过请求头与资源标识在服务器对比,比对成功之后。返回 304 读取本地磁盘资源
主要涉及到两组 header 字段
- http 1.0
Last-Modified
和If-Modified-Since
- http 1.1 (补充方案)
ETag
和If-None-Match
Last-Modified
和 If-Modified-Since
浏览器第一次请求资源时。服务器返回的 header 中会加上 Last-Modified,If-None-Match,Last-modified 是资源的最后修改时间,If-None-Match 是 last-modified 的值。
res.headers("Last-modified","Tue, 10 Jan 2023 07:25:20 GMT");
当浏览器再次请求该资源时,request 的请求头中会包含 If-Modified-Since,该值为浏览器缓存的之前返回的 Last-Modified。服务器收到 If-Modified-Since 后,根据资源的最后修改时间判断是否命中缓存。如果命中缓存,则返回 304,并且不会返回资源内容,不会返回 Last-Modified。
缺点:
- 首先它只是根据资源最后的修改时间戳进行判断的,如果请求的文件资源进行了重命名,但内容并没有发生变化,时间戳也会更新,从而导致协商缓存时关于有效性的判断验证为失效,需要重新进行完整的资源请求。这无疑会造成网络带宽资源的浪费,以及延长用户获取到目标资源的时间。
- 文件资源修改的时间戳单位是秒,如果文件修改的速度非常快,那么通过时间戳的方式验证缓存的有效性,是无法识别出文件资源的更新的。
ETag
和 If-None-Match
Etag 主要是服务器为不同资源进行哈希运算所生成的一个字符串,该字符串类似于文件指纹,只要文件内容编码存在差异,对应的 ETag 就会不同,因此可以使用 ETag 对文件资源进行更精准的变化感知。
文件指纹: 利用加密算法对整个文件内容进行加密 通过算法截取拼接后加密,生成文件资源唯一标识
缺点:
-
服务器对于生成文件资源的ETag需要付出额外的计算开销,如果资源较大,数量较多且修改比较频繁,那么生成ETag的过程就会影响服务器的性能。
-
另一方面ETag字段值的生成分为强验证和弱验证。强验证根据资源内容进行生成,能够保证每个字节都相同; 弱验证则根据资源的部分属性值来生成,生成速度快但无法确保每个字节都相同,并且在服务器集群场景下,也会因为不够准确而降低协商缓存的有效验证的成功率。
协商缓存示意图
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2天,点击查看活动详情