考虑到以下可能性,最有效的 ETag 生成是什么?

Ant*_*lad 5 caching http go http-headers

我最近一直在 Go 中缓存 http 响应,我正在尝试找出生成正确 ETag 的最有效方法。

现在我有以下可用数据:

  1. 当我渲染模板时所渲染的模板的名称。
  2. 动态数据被传递到 json 响应的模板或响应中。
  3. 整个响应主体。
  4. 身体的长度。
  5. 我可能缺少什么?

经过一番思考后,我得出的结论是,如果我将模板的名称和生成的动态数据结合起来,理论上应该会以最少的开销创建一个合法的唯一 ETag,但我不知道如果我开始想要返回 30kb 的 html 数据库结果。

我使用 Go 的 stdlib 中的 crc32 例程根据传递给它的数据生成 ETag。

有没有更好的方法来生成 ETag,甚至缓存动态数据?我不能只监视文件的最后修改时间,因为数据可以在文件不更改的情况下更改。

Jam*_*dge 1

一般来说,您希望使用计算成本低廉的东西作为 ETag。这样做的原因是,如果客户端发送条件请求(例如通过If-None-MatchHTTP 请求标头),您可以决定是否适合发送响应,304 Not Modified而不必对页面进行所有处理。

例如,如果您有某种页面内容的修订标识符,那么这可能是一个很好的 ETag。

如果您需要完成渲染页面所需的所有工作以生成 ETag,那么您也可以只使用渲染页面内容的哈希值,或者根本不使用 ETag。