Notes

HTTP 缓存

缓存分类

浏览器缓存

缓存只用于单个用户,存储位置位于用户的浏览器

代理缓存

缓存可以被多个用户使用,储存位置位于 ISP 或者或所在地区(如公司)架设的 web 代理,这样,通过这个 web 代理访问网络的用户可以共享代理服务器上的缓存

常见缓存案例

一般 HTTP 缓存都是针对 GET 请求,对于其他请求缓存并没有什么大作用

缓存控制

使用 Cache-control 头

禁止缓存

不存储客户端请求与服务端响应的内容

cache-control: no-store
cache-control: no-cache, no-store, must-revalidate

指定私有缓存/共享缓存

cache-control: private
//
cache-control: public

过期机制

cache-control: max-age=31536000

还有另外一个 Expires, 它是用来指定缓存过期的某个时间点

使用 Pragma 头

现在应该都不用了,用的话是用来兼容基于 HTTP/1.0 的客户端


缓存驱逐

当资源被缓存后,一般情况下是永久存储在缓存中,但由于缓存空间有限,因此会定期清理缓存,这个过程为缓存驱逐

浏览器如何驱逐缓存

驱逐过程

  1. 客户端发起请求,缓存检索到了一个对应的资源
    • 若缓存资源未到过期时间,则直接使用缓存
    • 若缓存资源已过过期时间,则在请求中附加一个 If-None-Match 头,请求发送到服务器,让服务器判断缓存资源是否还新鲜(缓存还可不可以继续使用)
    • 当缓存资源还新鲜,服务端返回 304(Not Modified),同时响应体不会带有实体信息,客户端中对应的陈旧资源又变成了新鲜资源
    • 当缓存资源陈旧,则服务端响应带有实体信息,同时,客户端使用新鲜资源替换陈旧资源

客户端如何计算过期时间

下面序号具有优先级

  1. 通过 cache-control: max-age=N 中的 N 来判断
  2. 查看 Expires 属性,比较 Expires 值与头部中 Date 属性
  3. 查看 Last-Modified 属性,通过规范文档中的公式计算得出过期时间

缓存校验

强校验器

ETag

弱校验器

Last-Modified


当客户端发起缓存校验后

References