HTTP协议缓存

216 阅读2分钟

image.png

缓存容器

  • memory cache 内存缓存容器(如sessionStroge)
  • disk cache 磁盘缓存容器(如localStroge)
    内存容器优先级比磁盘容器优先级高 |- | memory cache | disk cache | | ---- | ----------------- | ------------------ | | 相同点 | 只能存储一些派生类资源文件 | 只能存储一些派生类资源文件 | | 不同点 | 退出进程时数据会被清除 | 退出进程时数据不会被清除 | | 存储资源 | 一般脚本、字体、图片会存在内存当中 | 一般非脚本会存在内存当中,如css等 |

缓存类别

强缓存

加载资源时如果命中缓存,查看header字段(expires 和 cahe-control)确定是否采用此缓存。

Expires

过期时间,GMT时间串,如果本地时间在此过期时间前则采用。(http1.0)

cache Control

  • http1.1,比expires优先级高
  • 利用字段的max-age相对时间判断。
  • Cache-Control:max-age=3600,代表着资源的有效期是 3600 秒
    其他字段:
    no-cache:需要进行协商缓存,发送请求到服务器确认是否使用缓存。
    no-store:禁止使用缓存,每一次都要重新请求数据。
    public:可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。
    private:只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。
    Cache-Control 与 Expires 可以在服务端配置同时启用,同时启用的时候 Cache-Control 优先级高。

协商缓存

强缓存没有命中,发送请求,请求头带有协商缓存相关字段。

Last-Modify/If-Modify-Since

强缓存过期或有缓存不采用If-Modify-Since;
服务器返回时带有Last-Modify;
服务器比对客户端时间与文件修改时间,相同返回304;不会再带有last-modify与etag不同;
问题
周期性变回来了则可以用缓存但没有用。
只能精确到秒,短时间改变则不会更新。

ETag/If-None-Match

Etag可以理解为文件唯一识别码;
优先级比last-modify高。
即使命中也会返回etag。