在 HTTP 中使用 Etag 有很多好处吗?

Posted

技术标签:

【中文标题】在 HTTP 中使用 Etag 有很多好处吗?【英文标题】:Is there much advantage of using Etag in HTTP? 【发布时间】:2022-01-18 09:03:28 【问题描述】:

查看flask(werkzeug)围绕etag的源码,发现它生成一个响应对象,通过sha1从数据中生成etag,与请求的if-none-match etag进行比较,返回304或 200。因此无论是否有 etag,访问数据库和创建响应的过程都是相同的,而 etag 的好处就是不必向客户端发送数据。

当然,如果你有大量的数据,那是有好处的,但是如果数据不是那么大,是不是就认为没什么用了?

我认为与其从每个请求的响应中重新创建etag,不如将etag存储在redis或服务器内存等中,当作为目标的对象发生变化时请求,并在发出请求时将其与预先存储的 etag 进行比较。

这种缓存方式不常用吗?

【问题讨论】:

【参考方案1】:

ETag 是服务器生成的不透明字节序列。 HTTP standard 列出了一些可能的实现:

例如,具有特定于实现的版本控制的资源 应用于所有更改可能使用内部修订号,也许 与内容协商的差异标识符相结合,以 准确区分表示。其他 实现可能使用一个抗碰撞哈希 表示内容,各种文件属性的组合,或 具有亚秒级分辨率的修改时间戳

因此您可以看到,生成响应并计算其哈希值只是众多可能方法中的一种。 nginx、Flask、Django 和其他框架采用这种方法的原因是它是唯一不需要任何特定于应用程序知识的方法。无论如何生成响应,都可以保证准确无误。

因此,无论如何,如果您可以使用特定于应用程序的知识(如版本号)来计算 ETag 而无需计算响应,那么请随意这样做并享受额外的效率。不过,如果没有这些,哈希方法还是相当不错的:它成本低,潜在的好处很大(对于大型响应),并且不需要开发人员额外的工作。

【讨论】:

感谢您回答我的问题。这正是我一直在寻找的答案!

以上是关于在 HTTP 中使用 Etag 有很多好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

在Qt中我们使用更多的指针,有啥好处吗?

使用 boost::bind 有啥好处?

在 AES 加密中填充随机数据有好处吗?

把图片转成base64编码有啥好处吗?

使用对象初始化器有啥好处吗?

在 Weblogic 中复制连接池有啥好处吗?