HTTP深刻之缓存机制

缓存的规则

HTTP的缓存属于客户端缓存,因此咱们能够认为浏览器存在一个缓存数据库,用于储存一些不常常变化的静态文件(图片、css、js等)。能够将缓存分为强制缓存和协商缓存。css

强制缓存

能够理解为无须验证的缓存策略。对强缓存来讲,响应头中有两个字段 Expires/Cache-Control 来代表规则。web

当缓存数据库中已有所请求的数据时。客户端直接从缓存数据库中获取数据。当缓存数据库中没有所请求的数据时,客户端的才会从服务端获取数据。算法

Expires

Expires的值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。 不过ExpiresHTTP 1.0的东西,如今默认浏览器均默认使用HTTP 1.1,因此它的做用基本忽略。 另外一个问题是,到期时间是由服务端生成的,可是客户端时间可能跟服务端时间有偏差,这就会致使缓存命中的偏差。 因此HTTP 1.1 的版本,使用Cache-Control替代。数据库

Cache-Control

Cache-Control有不少属性,不一样的属性表明的意义也不一样。浏览器

  • private:客户端能够缓存
  • public:客户端和代理服务器均可以缓存
  • max-age=t:指定一个时间长度,在这个时间段内缓存是有效的,单位是s.
  • no-cache: 告诉浏览器、缓存服务器,无论本地副本是否过时,使用资源副本前,必定要到源服务器进行副本有效性校验。
  • must-revalidate:告诉浏览器、缓存服务器,本地副本过时前,能够使用本地副本;本地副本一旦过时,必须去源服务器进行有效性校验。
  • no-store:禁止缓存,每次请求都要向服务器从新获取数据。

协商缓存

又称对比缓存,客户端会先从缓存数据库中获取到一个缓存数据的标识,获得标识后请求服务端验证是否失效,若是没有失效服务端会返回304,此时客户端直接从缓存中获取所请求的数据,若是标识失效,服务端会返回更新后的数据。缓存

Last-modified/If-Modified-since

Last-modified: 服务器端资源的最后修改时间,响应头部会带上这个标识。第一次请求以后,浏览器记录这个时间,再次请求时,请求头部带上 If-Modified-Since 即为以前记录下的时间。服务器端收到带 If-Modified-Since 的请求后会去和资源的最后修改时间对比。若修改过就返回最新资源,状态码 200,若没有修改过则返回 304服务器

Etag/If-None-Match

由服务器端上生成的一段 hash 字符串,第一次请求时响应头带上 ETag: abcd,以后的请求中带上 If-None-Match: abcd,服务器检查 ETag,返回 304200google

可是实际应用中因为Etag的计算是使用算法来得出的,而算法会占用服务端计算的资源,全部服务端的资源都是宝贵的,因此就不多使用Etag了。代理

关于 last-modifiedEtag 区别,已经有不少人总结过了:code

  • 某些服务器不能精确获得资源的最后修改时间,这样就没法经过最后修改时间判断资源是否更新。
  • Last-modified 只能精确到秒。
  • 一些资源的最后修改时间改变了,可是内容没改变,使用 Last-modified 看不出内容没有改变。
  • Etag 的精度比 Last-modified 高,属于强验证,要求资源字节级别的一致,优先级高。若是服务器端有提供 ETag 的话,必须先对 ETag 进行 Conditional Request。

参考

HTTP 缓存机制一二三

HTTP缓存机制

HTTP 缓存

相关文章
相关标签/搜索