翻译翻译什么 TM 叫 HTTP 缓存

112 阅读2分钟

介绍下 HTTP 缓存

缓存分为私有还缓存和共享缓存,业务中最常接触的部分是私有缓存, 而私有缓存主要分为 HTTP 缓存, 和浏览器缓存, HTTP 缓存又分为强缓存和弱缓存(协商缓存)

强缓存直接返回本地资源副本, code 中会提示 (from cache) 而状态码值在不同浏览器有不同表现, Chrome 中返回 200, 而火狐中返回 304, 而常用实现强缓存的请求头是 Expires 和 Cache-control, Expires 是 HTTP 1.0 中的规范, 原理是定义一个绝对的过期时间, 而客户端时间是无法保障准确性的, 所以在 HTTP 1.1 推出了 更灵活的 Cache-control, 常用的值, no-store: 禁用缓存, no-cache: 禁止强缓存,走协商缓存, public: 可以被任意对象缓存, private: 仅私有缓存, max-age: 秒为单位的有效时间, 还有一些控制缓存过期后行为的值, 以及针对共享如何使用缓存的不常用字段, 同时还有个 Pragma: no-cache,的头,用于 Cache-control 对 HTTP1.0 的 向后兼容

协商缓存会先发送 一个包含条件验证字段的 GET 请求, 常用的请求头 if-modified-sine 值是 Date 和 if-none-match 值是一个 包含了版本,内容指纹 ETag, 分别代表时间 和 内容两个维度的验证, 前者表达的是在某个时间后是否有修改过文档, 后者表达的是, 内容是否发生了变化,因为有可能周期性写入,导致修改时间变了,但其实内容没有变化,所以采用 实体标签验证更好一些, 并且还有个场景, 修改并不重要, 不要所有的缓存都失效, 所以支持弱验证器, 强验证器是只要资源有变化就变更,而 弱验证器仅仅返回的内容实体发生变化才会变更弱验证器 比如 ETag: W/"v2.6"