HTTP缓存机制

153 阅读10分钟

1、http缓存介绍

HTTP 缓存是一种技术,用于减少网络请求数量和传输数据的大小,以提高网页加载速度。它通过在客户端(例如浏览器)或代理服务器中存储网页的副本,以避免重复请求数据。缓存使用 HTTP 标头,例如 Cache-Control 和 Expires,控制缓存行为。

HTTP 缓存可以减少服务器负载并提高用户体验。例如,如果客户端已经缓存了一个网页的副本,它就不需要再向服务器发送请求,因此该网页会更快地加载。此外,如果多个用户访问相同的网页,它只需要从服务器检索一次,并在多个客户端缓存,从而减少了服务器的带宽使用。

但是,缓存也有一些限制。例如,如果服务器上的内容更改,缓存的副本可能不再是最新的。为了解决这个问题,HTTP 标头可以控制缓存的生存期,以及当服务器内容更改时如何处理缓存的副本。

2、缓存类型

  1. 强缓存:浏览器直接使用缓存的副本,而不会发送请求到服务器。强缓存通过 HTTP 标头 Expires 和 Cache-Control 的 max-age 指令控制。
  2. 协商缓存:当强缓存不可用时,浏览器会发送一个请求到服务器,询问是否有更新的内容。服务器通过返回 HTTP 响应状态码(例如,304 Not Modified)和标头(例如,Last-Modified 和 ETag)告诉浏览器是否可以使用缓存的副本。

1、强缓存

HTTP 强缓存是指通过 HTTP 头信息中的 "Cache-Control" 和 "Expires" 字段来控制缓存的行为。它们告诉浏览器和缓存代理服务器是否可以直接使用缓存的资源,而不必向服务器请求。

"Cache-Control" 字段是 HTTP1.1 中提供的,它可以设置多种缓存控制选项,例如:

  • "public":该资源可以被任何缓存机制(包括共享缓存代理服务器)缓存。
  • "private":该资源只能被私有缓存机制(如浏览器缓存)缓存。
  • "no-cache":浏览器和缓存代理服务器必须每次向服务器验证缓存的有效性。
  • "max-age":指定缓存的有效时间(以秒为单位)。

"Expires" 字段是 HTTP1.0 中提供的,它指定缓存的过期时间。它和 "Cache-Control" 字段相似,但是不是所有浏览器都支持。

expires: Wed, 11 Sep 2019 16:12:18 GMT

通过设置强缓存,可以让浏览器和缓存代理服务器快速地使用缓存资源,而不必向服务器请求,从而提高网页的加载速度。

HTTP 强缓存也有一些限制和注意事项:

  • 如果服务器返回 "no-cache",那么浏览器和缓存代理服务器必须每次都向服务器请求。
  • 如果 "max-age" 设置的时间已经过去,那么浏览器和缓存代理服务器必须向服务器请求。
  • 如果服务器的内容发生变化,那么它的缓存也必须变化。因此,服务器必须通过更改 "Expires" 和 "Cache-Control" 字段来告诉浏览器和缓存代理服务器更新缓存。

因此,强缓存是一种有效的缓存机制,但是它并不适用于所有场景。在实际应用中,有时候需要使用弱缓存或者不使用缓存,以便确保网页的内容是最新的。

2、协商缓存

HTTP 协商缓存是一种用于处理浏览器和服务器之间缓存内容的机制。它是基于服务器和客户端之间的协商,以确定是否应该使用缓存。如果缓存内容可用,浏览器将使用缓存的内容,否则,浏览器将向服务器请求最新的内容。

下面是协商缓存的工作流程:

  1. 客户端发送请求到服务器。
  2. 服务器对请求进行处理,并在响应中包含 "Last-Modified" 或 "ETag" 字段。
  3. 客户端收到响应后,首先检查其缓存中是否存在该内容。
  4. 如果缓存中存在该内容,客户端发送请求到服务器,询问该内容是否发生变化。
  5. 服务器收到请求后,检查请求的内容是否已发生变化。如果内容未变,服务器返回 "304 Not Modified" 响应,告诉客户端使用缓存的内容。如果内容已变,服务器返回最新的内容。

协商缓存是一种弹性的缓存机制,可以根据实际情况动态地选择是否使用缓存。它可以在保证内容是最新的的同时,提高网页的加载速度。因此,协商缓存是一种很重要的 HTTP 缓存方式,常常用于网站的性能优化。

协商缓存的重要性在于,它可以避免浏览器每次都向服务器发送请求,从而节省带宽和服务器的资源。协商缓存可以提高网站的加载速度,并且可以在满足用户需求的同时,避免不必要的数据传输。

有些协议,如 HTTP/1.0,没有协商缓存,因此每次请求都需要向服务器发送请求。而 HTTP/1.1 和更高版本的协议则支持协商缓存,可以更好地利用缓存的优势。

综上所述,HTTP 协商缓存是一种重要的性能优化手段,它可以提高网站的加载速度,降低服务器的负担,提高用户的体验。

Last-Modidied

Last-Modified 是 HTTP 协议中的一个头信息,表示资源(例如图片、文件等)最后被修改的时间。

Last-Modified: Fri, 27 Oct 2017 06:35:57 GMT

在协商缓存中,当客户端请求一个资源时,服务器会将该资源的 Last-Modified 值一同返回。当客户端再次请求该资源时,会同时发送一个 If-Modified-Since 头信息,如果资源的 Last-Modified 值没有发生变化,服务器就会返回 304 Not Modified 状态码,告诉客户端缓存可以继续使用。

If-Modified-Since: Fri, 27 Oct 2017 06:35:57 GMT

Last-Modified 的作用是帮助客户端确定资源是否已被修改,如果没有发生变化,客户端就可以使用缓存中的内容。它与 Etag 的区别是,Last-Modified 是时间戳,而 Etag 是一个标识符,它表示资源内容的一个版本。

Etag

Etag 是 HTTP 协议中的一个头信息,它是一个由服务器生成的标识符,用来识别资源(例如图片、文件等)的一个版本。

ETag: W/"2a3b-1602480f459"

在协商缓存中,当客户端请求一个资源时,服务器会将该资源的 Etag 值一同返回。当客户端再次请求该资源时,会同时发送一个 If-None-Match 头信息,如果资源的 Etag 值没有发生变化,服务器就会返回 304 Not Modified 状态码,告诉客户端缓存可以继续使用。

If-None-Match: W/"2a3b-1602480f459"

Etag 的作用是帮助客户端确定资源是否已被修改,如果没有发生变化,客户端就可以使用缓存中的内容。它与 Last-Modified 的区别是,Last-Modified 是时间戳,而 Etag 是一个标识符,它表示资源内容的一个版本。

Last-Modified和Etag的区别

Last-Modified 和 Etag 是 HTTP 协议中的两个头信息,都用于协商缓存。

Last-Modified 记录的是资源的最后修改时间,Etag 记录的是资源的标识符。

两个字段是用于实现不同粒度级别的缓存协商。

使用 Last-Modified 可以快速判断一个资源是否已经过期,但是它有一个缺点:如果服务器的时间出现了偏差,就会导致误判;而 Etag 则不会存在这种情况,因为它是由服务器生成的一个标识符。

所以,服务器通常会同时返回两个字段,如果 Last-Modified 的值不对,就可以通过 Etag 来协商缓存。

总的来说,使用两个字段可以更好地确保缓存协商的正确性。

在实际应用中,协商缓存常常使用在以下场景:

  1. 静态内容缓存:静态内容如图片、JS 文件、CSS 文件等可以被协商缓存,以加快加载速度。
  2. API 请求缓存:API 请求经常返回大量的数据,协商缓存可以帮助减少不必要的数据传输,并且在数据没有发生变化的情况下加速请求。
  3. 动态内容缓存:动态内容也可以使用协商缓存,但需要根据实际情况设置适当的缓存策略,以避免缓存过期造成的问题。

协商缓存在性能优化中起到了重要的作用,因此开发人员应该熟练掌握协商缓存的相关技术,并在实际开发中适当地使用协商缓存。

3、实际应用

  1. 减少网络请求:当用户浏览网页时,浏览器会发送请求到服务器请求资源。如果资源已经被缓存,浏览器将使用缓存的副本,而不会再发送请求。这样就可以减少网络请求数量,从而加快网页加载速度。

  2. 减少带宽使用:当多个客户端请求同一资源时,如果有一个客户端缓存了该资源,其他客户端就可以使用缓存的副本,而不必重新请求该资源。这样就可以减少带宽使用,从而减少服务器负载。

  3. 提高用户体验:通过快速加载网页,用户体验得到了明显的提高。用户可以浏览更多网页,并且在更短的时间内得到更好的网页体验。

  4. 离线浏览:当用户在离线状态下浏览网页时,如果该网页的资源已经被缓存,用户就可以浏览网页,而不需要网络连接。这对于移动用户和无线环境的用户来说非常有用。

HTTP 缓存可以广泛应用于各种网络应用场景,例如:

  1. 静态网页:静态网页的资源通常是图片、CSS 和 JavaScript 文件,这些资源可以被缓存,以加快网页的加载速度。
  2. 动态网页:动态网页的资源通常是数据,可以使用缓存代理服务器或浏览器缓存来缓存该数据。这样就可以在服务器和客户端之间共享缓存,从而加快网页的加载速度。
  3. API 请求:API 请求的结果可以被缓存,以加快请求的响应速度。
  4. 资源文件:资源文件通常是图片、音频和视频文件,这些文件可以被缓存,以加快加载速度。
  5. CDN:内容分发网络 (CDN) 可以使用缓存代理服务器缓存网页的资源,以加快网页的加载速度。

总的来说,HTTP 缓存可以提高网页的加载速度,提高用户体验,减少网络请求和带宽使用,从而提高网络效率。

4、缓存资源的存放位置

缓存资源的存放位置可以分为三类:

  1. 客户端缓存:比如浏览器的缓存、手机 app 的缓存等,这些缓存是在客户端设备上存储的。
  2. 代理服务器缓存:如果请求经过了代理服务器,那么代理服务器会缓存请求的资源,并在后续请求中使用。
  3. CDN 缓存:如果请求经过了 CDN,那么 CDN 会缓存请求的资源,并在后续请求中使用。

在不同的场景中,使用不同的缓存机制可以更好地提高请求的效率,降低服务器的压力,并且减少请求的网络时间。

5、浏览器怎么实现清空缓存

Cache-Control设置为no-cache,从而实现强制刷新