强制缓存和协商缓存的理解

131 阅读4分钟

1. 什么是缓存机制?

  • 缓存机制

浏览器的缓存机制指的是在一段时间内保留接收到web资源的一个副本,如果在资源的有效时间内,发起了对这个资源的再一次请求,那么浏览器会直接使用缓存的副本,而不是向服务器发起请求

  • 优点

使用web缓存可以有效的提高页面的打开速度,减少不必要的网络带宽的消耗

2.缓存机制的两种方式

强制缓存和协商缓存是浏览器缓存机制中的两种主要方式

强制缓存

强制缓存,又称为强缓存,是在浏览器本地缓存的一种策略,主要是通过设定资源的缓存时间来决定的.

当浏览器请求一个网页时,如果页面中缓存没有过期或是失效,那么浏览器就不会向服务器发送请求,而是从本地缓存中读取资源.

例如:http响应报文中的expires和cache-control字段,cache-control的优先级会高于expires

expires

expires是Http1.0控制页面缓存的字段,其值为服务器返回该请求结果缓存的到期时间,当再次发送请求时,如果客户端的时间小于expires的值时,直接使用缓存结果

cache-control

cache-control是Http1.1控制页面缓存的字段,代替了expires,原因是在于expires控制缓存是通过浏览器的时间和服务器端返回的时间做比较,浏览器的时间可以人为修改,会让强制缓存失效

  • cache-control实现缓存主要是根据取值决定:
    • public:所有内容都会被缓存(客户端/代理服务器/CDN)
    • private:只有客户端可以缓存(这是cache-control的默认值)
    • no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
    • no-store:所有内容都不会缓存,强制缓存和协商缓存都不使用
    • max-age=xxx:缓存在xxx秒后失效

协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,有服务器根据缓存标识决定是否使用缓存的过程,主要有以下两种情况:

  1. 协商缓存生效,返回304,服务器告诉浏览器资源未更新,则再去浏览器缓存中访问资 源
  2. 协商缓存失效,返回200和请求结果

同样,协商缓存的标识也是在响应报文的HTTP头和请求结果一起返回给浏览器的,控制协商缓存的字段分别有:

  • Last-Modified/If-Modified-Since
  • Etag/If-None-Match

其中Etag/If-None-Match优先级比Last-Modified/If-Modified-Since

Last-Modified/If-Modified-Since

Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间。

If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,通过此字段告诉服务器该资源上次请求返回的最后被修改时间。服务器收到该请求,发现请求头含有If-Modified-Since字段,则会根据If-Modified-Since的字段值与该资源在服务器的最后被修改时间做对比,若服务器的资源最后修改时间大于If-Modified-Since的字段值,则重新返回资源,状态码为200;否则返回304,代表资源无更新,可以继续使用缓存文件。

Etag/If-None-Match

Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成)。

If-None-Match是客户端再次发起请求时,携带上次请求返回的唯一标识Etag值,服务端收到该请求后,发现该请求含有If-None-Match,则会根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件,否则重新返回资源,状态码为200.

区别

强制缓存和协商缓存的主要区别在于:

  • 强制缓存不会向服务器发送请求,直接从本地缓存中读取资源;
  • 而协商缓存会向服务器发送请求,由服务器根据特定条件判断是否从缓存中读取资源。