HTTP(一)


HTTP缓存


1 缓存的类型:

缓存是一种保存资源副本并在下次请求中直接使用该副本的技术,缓存能够节约网络资源,提升页面响应速度。常见的缓存类型分为共享缓存和私有缓存

1.1 私有缓存

私有缓存只能用于单独用户,常见的浏览器缓存便是私有缓存。私有缓存能够存储用户通过http下载过的文档,从而在用户再次访问时直接提供给用户,而不用向服务器发送请求。

1.2 共享缓存

共享缓存能够被多个用户使用,常用的web代理中便使用的共享缓存


2 缓存的目标

常用的http缓存只能缓存 GET响应,而对其他类型的响应却无能为力。缓存的关键在于request method 和目标 url。缓存案例:

  • 检索请求成功的响应:响应码为 200。
  • 永久重定向的响应: 响应码为 301。
  • 页面不存在:响应码为 404。
  • 局部信息返回: 响应码为 206。

3 缓存控制

通过 http报文头钟的 Cache-Control字段来进行缓存控制,请求头和响应头通过不同的值来定义缓存的策略。

3.1 禁止进行缓存

缓存中不会存储任何客户端请求和服务端响应的的内容,每次客户端发起的请求都会下载完整的内容

Cache-Control: no-cache
Cache-Control: no-cache, no-store, must-revalidate

3.2 强制确认缓存

客户端每次发送请求时,缓存会将此请求发至服务器,确认缓存是否过期。如果缓存未过期,服务器会返回 304,此时才能使用本地缓存副本

Cache-Control: no-cach

3.3 私有缓存和公共缓存

'public'表示该响应可被任何中间人缓存,包括常不能被中间人缓存的响应,譬如带有HTTP验证信息的页面和某些特定影响状态码的响应
而 'private'私有缓存则表示响应专用于某单个用户,中间人不能缓存此响应,只能缓存至浏览器私有缓存

Cache-Control: public
Cache-Control: private

3.4 缓存过期机制

“max-age="表示缓存的保持有效(不过期)的最大时间,表示距离请求发起的时间,以秒计算

Cache-control: max-age=31536000

3.5 缓存验证确认

在客户端发起请求时,如果请求的是一个陈旧的资源,通过设置 must-revalidate来验证它的状态,如果缓存已经过时,过期的缓存将不被使用,此时应该从源服务器上获取资源

Cache-control: must-revalidate

4 新鲜度

由于缓存空间有限,存储新的缓存必定有旧的缓存被驱逐,也就是过期。客户端和服务端之间以过期时间也就是新鲜度来确认缓存是否过期。如果缓存已经过期,则缓存会驱逐旧的缓存。
在清清除过程中将,旧的缓存并不会被直接清除,客户端发送请求时,缓存检测到旧的资源,会在此请求上附加头部 If-None-Match。如果资源还是新鲜的,服务端会返回 304(Not Modified),表示该资源新鲜。如果资源已经过期,此时服务端才会返回新的资源

4.1 缓存寿命

缓存寿命的计算的依据依次是:

  • 请求头中的 Cache-Control: max-age=N。相应的缓存寿命即为 N,从设置开始,N秒之后过期。
  • Expires属性,Expires属性的值为过期的时间点,在这个时间点后,该缓存被认为过期
  • Last-Modified信息。缓存的寿命为头里面 Date表示的事件点减去 Last-Modified的时间点的结果乘以 10%

4.2 加速资源

为了提高页面的响应效率,合理的使用缓存是非常不错的做法,但当我们更新资源时,如果缓存依旧有效,我们的资源可能不会立马生效,甚至出现有些资源已经生效,而有些资源却没有生效的情况。为了解决这个情况,我们通常会在资源中添加版本号,但如果每次更新资源都要更改版本号,在项目比较复杂的时候,工作量会非常的大。在实际工作中,我们通常会在资源的引用处添加版本号,而资源本身并没有版本号


5 缓存验证

我们可以通过在http头部添加 Cache-Control: must-revalidate来开启缓存验证。客户端通过在头部中添加 If-None-Match来验证需要验证的缓存,其中,If-None-Match的值为服务器之前传递过来的 Etags值中的一个或者多个。
当验证通过时,服务器将返回 304,If-None-Match的值为 false。当验证不通过时,服务器将返回 200并返回新的资源


6 带Vary头的响应

通过在头中添加 vary属性,可以验证请求报文中的头信息,从而判定缓存是否命中。当缓存服务器收到一个请求,只有当前请求和缓存中的响应头都匹配,才能使用缓存
譬如可以设置的 vary: User-Agent来区分移动端的缓存和PC端的缓存,从而避免不同终端返回错误的缓存

你可能感兴趣的:(HTTP(一))