计算机网络 HTTP 缓存

01.http缓存有何控制

  • Http的缓存主要利用header里的两个字段来控制:Cache-control,ETag

02.Cache-control介绍

  • Cache-control主要包含以及几个字段:

    1
    2
    3
    4
    5
    private:则只有客户端可以缓存
    public:客户端和代理服务器都可以缓存
    max-age:缓存的过期时间
    no-cache:需要使用对比缓存来验证缓存数据
    no-store:所有内存都不会进行缓存
  • 实际上就是在这里面设置了一个缓存策略,由服务端第一次通过header下发给客户端,可以看到:

    • max-age即缓存过期的时间,则之后再次请求,如果没有超过缓存失效的时间则可以直接使用缓存。
    • no-cache:表示需要使用对比缓存来验证缓存数据,如果这个字段是打开的,则就算max-age缓存没有失效,则还是需要发起一次请求向服务端确认一下资源是否有更新,是否需要重新请求数据,至于怎么做对比缓存,就是下面要说的Etag的作用。如果服务端确认资源没有更新,则返回304,取本地缓存即可,如果有更新,则返回最新的资源。
    • no-store:这个字段打开,则不会进行缓存,也不会取缓存。
  • Cache-Control

    • HTTP/1.1 通过 Cache-Control 首部字段来控制缓存。
  • 禁止进行缓存

    • no-store 指令规定不能对请求或响应的任何一部分进行缓存。
    1
    Cache-Control: no-store
  • 强制确认缓存

    • no-cache 指令规定缓存服务器需要先向源服务器验证缓存资源的有效性,只有当缓存资源有效才将能使用该缓存对客户端的请求进行响应。
    1
    Cache-Control: no-cache
  • 私有缓存和公共缓存

    • private指令规定了将资源作为私有缓存,只能被单独用户所使用,一般存储在用户浏览器中。
    1
    Cache-Control: private
    • public 指令规定了将资源作为公共缓存,可以被多个用户所使用,一般存储在代理服务器中。
    1
    Cache-Control: public
  • 缓存过期机制

    • max-age指令出现在请求报文中,并且缓存资源的缓存时间小于该指令指定的时间,那么就能接受该缓存。
    • max-age指令出现在响应报文中,表示缓存资源在缓存服务器中保存的时间。
    1
    Cache-Control: max-age=31536000
    • Expires首部字段也可以用于告知缓存服务器该资源什么时候会过期。
    1
    Expires: Wed, 04 Jul 2012 08:26:05 GMT
    • 在 HTTP/1.1 中,会优先处理 max-age 指令;
    • 在 HTTP/1.0 中,max-age 指令会被忽略掉。

03.ETag介绍

  • ETag:即用来进行对比缓存,Etag是服务端资源的一个标识码

    • 当客户端发送第一次请求时服务端会下发当前请求资源的标识码Etag,下次再请求时,客户端则会通过header里的If-None-Match将这个标识码Etag带上,服务端将客户端传来的Etag与最新的资源Etag做对比,如果一样,则表示资源没有更新,返回304。
    • 通过Cache-control和Etag的配合来实现Http的缓存机制。
  • URL 不能唯一表示资源,例如 http://www.google.com/ 有中文和英文两个资源,只有 ETag 才能对这两个资源进行唯一标识。

    1
    ETag: "82e22293907ce725faf67773957acd12"
    • 可以将缓存资源的ETag值放入If-None-Match 首部,服务器收到该请求后,判断缓存资源的 ETag 值和资源的最新ETag值是否一致,如果一致则表示缓存资源有效,返回 304 Not Modified。
    1
    If-None-Match: "82e22293907ce725faf67773957acd12"
    • Last-Modified首部字段也可以用于缓存验证,它包含在源服务器发送的响应报文中,指示源服务器对资源的最后修改时间。但是它是一种弱校验器,因为只能精确到一秒,所以它通常作为 ETag 的备用方案。如果响应首部字段里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since 来验证缓存。服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 OK。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 Not Modified 响应。
    1
    2
    Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
    If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

04.缓存优点

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

05.缓存实现方法

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