Edge中的HTTP场景实践|青训营

99 阅读9分钟

缓存类型

强缓存

强缓存是一种HTTP缓存策略,用于在浏览器中缓存资源并减少对服务器的请求。它通过在服务器返回资源的响应头中设置一些字段来实现。当浏览器接收到含有强缓存的资源响应后,在一定的有效期内,浏览器会将该资源保存在本地缓存中,并在后续请求该资源时直接使用本地缓存,而不会再向服务器发起请求。

​ ​ ​ ​ ​ ​ ​ ​ 强缓存的作用在于提高页面加载速度和减少网络流量,因为在缓存有效期内,浏览器无需再次向服务器请求相同的资源,从而节省了网络请求时间和带宽。通常适用于不经常更改的静态资源,如图片、CSS文件、JavaScript文件等。它是HTTP缓存中最简单和高效的一种策略,结合其他缓存策略(如协商缓存),可以更好地优化网页性能,提高用户体验。

常见的强缓存策略使用以下两个HTTP响应头字段来指示浏览器进行缓存:

  1. Cache-Control: 通过该字段可以设置缓存的各种行为,其中的max-age指令用于设置资源在本地缓存中的最大有效时间,以秒为单位。示例:Cache-Control: max-age=3600 表示资源在本地缓存有效期为3600秒,即1小时。

  2. Expires: 通过该字段设置资源的过期时间,是一个具体的日期和时间,表示资源在该时间之后过期。示例:Expires: Wed, 08 Sep 2023 16:00:00 GMT 表示资源在该日期时间之后过期。

​ ​ ​ ​ ​ ​ ​ ​ 当浏览器请求资源时,会首先检查缓存中的Cache-ControlExpires字段,如果资源尚未过期,则直接使用本地缓存。只有当资源过期后,浏览器才会向服务器发送请求,并且服务器会返回新的资源及新的缓存策略。

协商缓存

协商缓存是一种在网络通信中用于优化性能的机制。它在Web服务器和客户端(通常是浏览器)之间发生,目的是减少重复请求和传输相同的资源,从而节省带宽和提高加载速度。协商缓存使得资源可以在过期前得到更新,并且避免了不必要的数据传输,从而提高了网站性能和用户体验。这对于那些拥有大量静态资源、或者需要频繁更新的网站特别有益。

​ ​ ​ ​ ​ ​ ​ ​ 当浏览器请求一个资源(例如图片、CSS文件、JavaScript文件等)时,服务器可以使用HTTP协商缓存机制来判断是否需要返回资源的完整内容。这样,浏览器不必每次都下载完整的资源,而是通过与服务器进行“协商”,确定是否可以使用本地缓存的版本。这样可以减少对服务器的请求压力,同时加快页面加载速度。

​ ​ ​ ​ ​ ​ ​ ​ 在协商缓存中,常见的两个HTTP头部字段是ETag(实体标签)和Last-Modified(最后修改时间)。服务器通过这些字段来告知浏览器资源的唯一标识和最后修改时间。浏览器会在后续请求中携带这些信息,通过发送If-None-MatchIf-Modified-Since头部字段,询问服务器资源是否有更新。如果服务器认为资源没有改变,它可以返回一个特殊的HTTP状态码304 Not Modified,告诉浏览器可以使用本地缓存副本。

私有缓存

私有缓存是一种缓存机制,用于在网络通信中优化性能和减少重复请求。私有缓存是指缓存内容只能被特定用户(通常是单个用户的浏览器)所使用,不能被共享或在不同用户之间共享。使用私有缓存可以显著减少重复请求和提高页面加载速度,从而提升网站的性能和用户体验。

​ ​ ​ ​ ​ ​ ​ ​ 当浏览器请求一个资源时,服务器可以在HTTP响应头部中设置Cache-Control字段,指示浏览器是否可以对该资源进行缓存,并设置缓存的私有性。私有缓存通常使用private指令来声明。其具有如下特点:

  1. 仅供特定用户使用:私有缓存中的内容只能由发起请求的用户(浏览器)所使用,其他用户无法访问该缓存。
  2. 不适合共享:由于私有缓存是与用户相关的,所以不能被多个用户之间共享,这与共享缓存(如公共代理服务器缓存)不同。
  3. 常用于个性化内容:私有缓存适用于包含用户个性化信息的资源,比如登录后的页面、用户设置等,这些内容对不同用户是不同的。

​ ​ ​ ​ ​ ​ ​ ​ 私有缓存与公共缓存(例如共享代理服务器缓存)相比,对于保护用户隐私和安全性更为重要。因为私有缓存只能由单个用户访问,不会出现敏感信息泄露给其他用户的情况。

过期策略

过期策略是在缓存系统中定义缓存对象(例如网页、图片、视频等)的有效期限的规则。过期策略决定了缓存对象在何时被认为已过期,从而需要重新获取最新内容。在缓存系统中,缓存对象被保存在快速访问的存储介质中,比如内存或专门的缓存服务器。但是,缓存的内容并非永久有效,因为原始数据可能会发生变化,导致缓存的内容变得过时或无效。为了确保缓存的有效性,需要设置合适的过期策略。

​ ​ ​ ​ ​ ​ ​ ​ 选择合适的过期策略对于缓存系统的性能和数据一致性至关重要。如果过期时间设置得太短,频繁地刷新缓存可能会导致缓存系统的性能下降;如果过期时间设置得太长,用户可能会获取到过时的数据。因此,需要根据具体应用场景和数据更新频率来选择合适的过期策略。常见的过期策略有以下几种:

  1. 时间过期:设置一个固定的时间,缓存对象在达到该时间后被认为过期。例如,将缓存的有效期设置为1小时,意味着在1小时后需要重新获取最新内容。

  2. 访问过期:当缓存对象在一段时间内没有被访问时,被认为已过期。这个策略需要记录缓存对象的访问时间,并根据一定的时间间隔来判断是否过期。

  3. 失效策略:当原始数据发生变化时,缓存对象立即失效,需要重新获取最新内容。这通常通过与后端数据源进行通信,监测数据是否有变化来实现。

  4. 主动刷新:定期地或在某些特定事件触发时,主动刷新缓存内容,以保持缓存数据的有效性。

以抖音为例

tmp.png

age:16529970
cache-control: max-age=31536000
content-length: 6211
content-type: image/png
date: Thu, 17 Nov 2022 04:14:32 GMT
last-modified: Wed, 16 Nov 2022 03:41:57 GMT
  • age表示资源在缓存中的存储时间,单位为秒。这个值是指代理服务器或缓存服务器将资源保存在缓存中的时间。它表示资源从源服务器返回后,经过了16529970秒的时间,该缓存副本就被返回给了请求的客户端或代理服务器。

  • cache-control定义了缓存的最大有效期,单位为秒。该响应指示缓存副本可以在本地缓存中存储31536000秒(一年)。这意味着在未来一年内,如果有对同一资源的请求,客户端或代理服务器可以使用缓存副本而无需向服务器发送请求。

  • content-length指示响应主体的长度,单位为字节。表示了响应的主体内容的长度为6211字节。

  • content-type表示响应主体的MIME类型。表明了响应主体是一个PNG格式的图像(抖音图标)。

  • date指示响应生成的日期和时间。表明是在GMT时间2022年11月17日上午4点14分32秒生成的。

  • last-modified指示资源的最后修改日期和时间。故这个资源最后一次修改是在GMT时间2022年11月16日上午3点41分57秒。

以Google news为例

tmp.png

age: 344202
cache-control: public, max-age=31536000
content-length: 15620
content-type: font/woff2
date: Thu, 03 Aug 2023 03:26:37 GMT
expires: Fri, 02 Aug 2024 03:26:37 GMT
last-modified: Mon, 22 Apr 2019 23:42:59 GMT
  • age: 16529970 表示资源在缓存中的存储时间,单位为秒。这个值是指代理服务器或缓存服务器将资源保存在缓存中的时间。它表示资源从源服务器返回后,经过了16529970秒的时间,该缓存副本就被返回给了请求的客户端或代理服务器。

  • cache-control: max-age=31536000定义了缓存的最大有效期,单位为秒。该响应指示缓存副本可以在本地缓存中存储31536000秒(一年)。这意味着在未来一年内,如果有对同一资源的请求,客户端或代理服务器可以使用缓存副本而无需向服务器发送请求。

  • content-length: 6211:指示响应主体的长度,单位为字节。响应的主体内容的长度为6211字节。

  • content-type: image/png表示响应主体的MIME类型。该响应主体是一个PNG格式的图像。

  • date: Thu, 17 Nov 2022 04:14:32 GMT指示响应生成的日期和时间。这个响应是在GMT时间2022年11月17日上午4点14分32秒生成的。

  • last-modified: Wed, 16 Nov 2022 03:41:57 GMT指示资源的最后修改日期和时间。这个资源最后一次修改是在GMT时间2022年11月16日上午3点41分57秒。