5

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

现在我有以下可用数据:

  1. 当我渲染模板时要渲染的模板的名称。
  2. 传递到模板或响应的动态数据以用于 json 响应。
  3. 整个响应体。
  4. 身体的长度。
  5. 我可能会丢失的东西?

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

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

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

4

2 回答 2

1

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

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

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

于 2013-02-17T14:10:07.567 回答
0

如果您正在寻找一种有效的ETag机制并且不需要加密强的东西,我建议您使用 CRC-32。为了帮助防止冲突,您可以结合模板名称、数据长度和 crc 等一些内容:

func etag(name string, data []byte) string {
    crc := crc32.ChecksumIEEE(data)
    return fmt.Sprintf(`W/"%s-%d-%08X"`, name, len(data), crc)
}

将产生一个像W/"tpl-17-3074C885".

于 2013-02-18T19:00:50.300 回答