返回

论 Last-Modified 与 ETag 头部生成策略在协商缓存中的应用

前端

引言

在 Web 性能优化的领域,协商缓存技术扮演着至关重要的角色。它允许客户端和服务器协商资源的最新版本,从而减少不必要的下载,提升用户体验。其中,Last-Modified 和 ETag 头部是协商缓存的核心元素,它们指示资源的最后修改时间和实体标记。本文将深入探讨 Last-Modified 和 ETag 头部的生成算法,分析其优缺点,并为最佳缓存策略的制定提供指导。

Last-Modified 头部

Last-Modified 头部记录资源的最后修改时间,通常基于文件的 mtime 元属性,表示文件内容的修改时间。当客户端请求资源时,服务器会将 Last-Modified 头部包含在响应中。如果客户端本地缓存的资源具有相同的 Last-Modified 值,则表明资源未更新,客户端可以直接使用缓存版本,无需重新下载。

生成算法:

Last-Modified = mtime(文件)

优点:

  • 简单易行,实现方便。
  • 适用于静态资源,如图片、CSS 和 JavaScript 文件。

缺点:

  • 精度依赖文件系统,如果文件元属性未准确更新,可能会导致缓存失效。
  • 不适用于内容经常变动的动态资源。

ETag 头部

ETag 头部是一个实体标记,由服务器生成,唯一标识资源的当前版本。它可以是基于文件哈希、文件大小或任何其他服务器特定的算法。当客户端请求资源时,服务器会将 ETag 头部包含在响应中。如果客户端本地缓存的资源具有相同的 ETag 值,则表明资源未更新,客户端可以直接使用缓存版本,无需重新下载。

生成算法:

ETag 头部的生成算法因服务器而异,可以基于以下方式:

  • 文件哈希:对文件内容进行哈希运算,生成唯一标识。
  • 文件大小和修改时间:将文件大小和修改时间组合成 ETag。
  • 服务器特定的算法:服务器可以根据自身需求定制 ETag 生成算法。

优点:

  • 精度高,不易受文件系统影响。
  • 适用于动态资源,如数据库驱动的页面。
  • 支持并发修改检测。

缺点:

  • 相比 Last-Modified,实现相对复杂。
  • 生成 ETag 需要额外的计算开销。

头部选择策略

在实际应用中,Last-Modified 和 ETag 头部可以同时使用,以获得最佳的缓存效果。以下是一些常见的头部选择策略:

  • 优先使用 ETag: ETag 头部精度更高,适用于大多数场景。当服务器支持 ETag 时,优先使用 ETag 头部。
  • 兼容性优先: 对于不支持 ETag 的客户端或服务器,使用 Last-Modified 头部。
  • 混合使用: 同时使用 Last-Modified 和 ETag 头部,取两者中较新的值作为判断依据。

结论

Last-Modified 和 ETag 头部是协商缓存中的关键元素,理解其生成算法和优缺点对于制定最佳缓存策略至关重要。Last-Modified 头部简单易行,适用于静态资源;而 ETag 头部精度更高,适用于动态资源和并发修改检测。根据服务器特性和资源类型,选择合适的头部生成算法和策略,可以有效提升 Web 应用的性能和用户体验。