HTTP的场景实践 | 豆包MarsCode AI刷题

197 阅读4分钟

我们对bilibili的某个图片资源进行缓存分析

1.png

以下是该图片的http资源请求详情

2.png


相关响应标头分析

  1. Cache-Control

    • 值为:max-age=31536000
    • 解释: 该字段定义了资源的缓存时间(以秒为单位)。max-age=31536000 表示客户端或中间缓存服务器可以缓存该资源 1 年(31536000 秒)。这意味着在这一年内,浏览器可以直接从缓存加载资源,而不需要再次向服务器发送请求。
    • 优点: 减少了重复请求,有助于提升页面加载性能。
  2. Expires

    • 值为:Sun, 23 Nov 2025 18:01:22 GMT
    • 解释: 指定了资源的到期时间,和 Cache-Control: max-age 类似,但优先级较低。此处表示该资源的有效期限为 2025 年 11 月 23 日。
    • 冗余性: 现代浏览器通常更优先使用 Cache-Control 指令,因此这个字段更多是为了兼容性保留。
  3. Last-Modified

    • 值为:Fri, 22 Nov 2024 10:39:46 GMT
    • 解释: 表示服务器上该资源的最后修改时间。客户端在下一次请求时可以使用 If-Modified-Since 头部,与该值进行对比。如果资源未更新,服务器会返回 304 状态码,避免重新传输整个资源。
    • 优点: 减少了带宽使用,提升加载速度。
  4. ETag

    • 值为:+8zYNzCt9wOMwRWBBSZlA==
    • 解释: ETag 是资源的实体标签,提供一种更精确的方式来验证资源是否发生变化。与 Last-Modified 类似,客户端在请求时可以携带此值(If-None-Match),服务器通过对比决定是否返回 304 状态码。
    • 优势:Last-Modified 比较,ETag 可以检测到更细粒度的变化,例如文件内容的改动,即便文件的修改时间未变。
  5. Age

    • 值为:56584
    • 解释: 表示该资源在缓存中已经存储了 56584 秒(约 15.7 小时)。这一字段由缓存服务器添加,用于告知当前资源的缓存状态。
  6. Vary

    • 值为:Accept-Encoding, Origin, X1-Bilispy-Color
    • 解释: 表示缓存依据的可变条件,浏览器或中间缓存服务器可能根据 Accept-Encoding 和其他头部内容存储不同版本的缓存。这确保了在不同条件下(如 gzip 压缩与否)可以正确返回对应的资源。

缓存策略解读

强缓存:Cache-Control: max-ageExpires

  • 该资源具有强缓存策略(1 年),表明这是一个静态图片资源,通常不会频繁更改。
  • 在缓存有效期内,浏览器会直接从本地缓存中读取图片,而不会向服务器发送请求。

协商缓存:Last-ModifiedETag

  • 尽管设置了强缓存,但仍保留了协商缓存的机制。这在资源更新频率较低时十分有用:

    • 如果资源更新了(比如图片换了新的版本),服务端可以通过修改 Last-Modified 或更新 ETag 的值通知客户端重新下载资源。
    • 同时,通过 304 状态码减少不必要的资源重新加载。

优先级机制

  • Cache-Control 优先级最高,现代浏览器会优先考虑其设置。
  • Expires 是兼容性策略,用于支持老旧浏览器。
  • ETagLast-Modified 提供了额外的校验机制,确保在资源更新后可以强制刷新缓存。

中间缓存的作用

  • 字段 Age 表示该资源已被缓存服务器(CDN 或代理服务器)缓存了一段时间。利用中间缓存可以大幅降低源服务器的压力,并缩短响应时间。

改进与优化建议

  1. 缓存更新策略:

    • 对于强缓存的资源,建议采用文件名带版本号的方式(如 image_v2.avif),以便在资源更新后能够立即生效,避免浏览器继续使用旧版本。
  2. 合理设置 Vary

    • 目前的 Vary 设置较复杂,可能会导致缓存命中率降低。例如可以只保留与实际响应差异相关的字段(如 Accept-Encoding)。
  3. 结合 CDN 使用:

    • 配合 CDN,利用全局分布式缓存减少网络延迟,同时提高资源的可用性和响应速度。
  4. 优化协商缓存:

    • 如果资源更新极少,可以只保留 ETag 而移除 Last-Modified,从而避免两个机制的冗余性。

总结

该请求的缓存策略是一个典型的“强缓存 + 协商缓存”的组合模式,兼顾了性能和更新机制的需求:

  • 强缓存通过 Cache-Control: max-age 减少频繁的请求。
  • 协商缓存通过 Last-ModifiedETag 提供了灵活的更新能力。
  • 配合 Vary 字段可以为不同环境提供个性化响应,但需要权衡缓存命中率。

这种策略在实际项目中广泛应用于静态资源的缓存,例如图片、样式表、脚本文件等,有助于提升用户体验和站点性能。