http协议_缓存cache机制

使用缓存的原因

  • 缓解服务器压力;
  • 降低客户端获取资源的延迟:缓存通常位于内存中,读取缓存的速度更快。并且缓存在地理位置上也有可能比源服务器来得近,例如浏览器缓存。

缓存实现方法

  • 让代理服务器进行缓存;
  • 让客户端浏览器进行缓存。

缓存设置

http协议中,可以通过响应报文的"Cache-Control" 首部字段来控制缓存,如:

Cache-Control : public, max-age=200

可缓存性

用来确定 Http 响应内容是否可以被缓存,以及可以被哪些地方缓存

  • public : 指响应信息返回时,所经过的路径中的(包括路径中间的一些代理服务器,以及发出请求的客户端)任何节点都可以对返回的内容做本地缓存
  • private : 返回的响应消息只可以被发起请求的客户端所缓存
  • no-cache : 会在发起请求的客户端做缓存,但该缓存能不能被使用需要经过服务端的缓存验证,可以理解为“会在本地做缓存,但该缓存不一定能够被使用”.
  • no-store : 不能在本地做缓存,需要不断从服务端获取内容来使用

缓存过期机制

  • max-age = : 设置缓存内容经过多少秒才算过期,过期之后,浏览器才会再次发起请求获取数据
  • s-maxage =  : 会代替"max-age",但它只会在代理服务器中生效,是专为代理服务器使用的
  • max-stale =  : 该字段是请求报文中所带的字段,表示在该字段设置的时间内,即使缓存到期,客户端仍然会使用缓存的内容. 
  • Expires :用于告知缓存服务器该资源什么时候会过期

注:在 HTTP/1.1 中,会优先处理 max-age 指令;在 HTTP/1.0 中,max-age 指令会被忽略掉。

重新验证

  • must-revalidate : 指在设置的max-age时间到期后,必须从服务端重新获取内容,不能使用本地缓存
  • proxy-revalidate : 类似"must-revalidate", 用于缓存服务器

其他

  • no-transform : 主要用于代理服务器,指定代理服务器不能对返回的内容做转换处理

缓存验证

通过响应消息的首部字段"Last-Modified"或者"Etag"可以验证本地缓存是否需要更新

  • Last-Modified : 为资源的上次修改时间,作为响应报文的首部信息传递给请求端,请求端在下次请求该资源时,会携带"If-Modified-Since"或者"If-Unmodified-Since"字段(字段内容为为服务端响应消息的Last-Modified值),从而对比上次修改的时间来验证资源是否需要更新

Last-Modified 是一种弱校验器,因为只能精确到一秒,所以它通常作为 ETag 的备用方案。服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 OK。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 Not Modified 响应。

Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
  • Etag : 对资源进行签名,资源内容改变则其签名改变,Etag便是签名内容.将Etag作为响应消息的头部信息传递请求端,请求端在下次请求该资源时,会携带"If-Match-Since"或者"If-None-Match"字段(字段内容为为服务端响应消息的Etag值),从而对比资源的签名来验证资源是否需要更新

ETag 是资源的唯一标识。URL 不能唯一表示资源,例如 http://www.google.com/ 有中文和英文两个资源,只有 ETag 才能对这两个资源进行唯一标识。

ETag: "82e22293907ce725faf67773957acd12"

可以将缓存资源的 ETag 值放入 If-None-Match 首部,服务器收到该请求后,判断缓存资源的 ETag 值和资源的最新 ETag 值是否一致,如果一致则表示缓存资源有效,返回 304 Not Modified。

If-None-Match: "82e22293907ce725faf67773957acd12"

http协议_缓存cache机制_第1张图片

注:为了解决在服务端更新内容后,客户端不知道服务端的更新而依旧使用未更新的本地缓存的问题,一个常用的解决方案是:在资源内容打包命名时,会在其名字后加上一段哈希码,该哈希码与资源内容相关,当资源内容改变时其哈希码会跟着改变,反映到请求页面中,即其请求的url发生了变化,这时代表了一个新的请求,将不会使用原来的本地缓存内容.这就是为什么在静态资源内容完成后,命名时往往需要加一段与其内容相关的哈希码的原因,即为了解决资源内容被更新时及时刷新缓存的问题.

你可能感兴趣的:(http协议)