根据半长时间操作的结果生成Etag



我正试图了解一些缓存技术,而我现在正在研究的是Etags/conditional get。据我所知,你通常做的是:

  • 提出请求。如果可用,客户端将在etag标头中提供哈希
  • 操作运行并获取结果对象
  • 根据该结果对象,您可以通过MD5散列等方法生成一个etag
  • 如果需要etag,请将它们进行比较。如果匹配,则返回Content Not Modified,否则返回Content和新etag

想想全局,我有点困惑。在所有情况下,我可以看到使用Not Modified响应可以为您节省不必要的响应体的额外字节,但这对服务器处理时间有什么影响?相反,它似乎什么都不做,因为服务器仍然必须生成响应对象,该对象包括它到达那里所需的所有后续进程。例如,如果操作非常复杂,需要几秒钟才能完成,该怎么办。不管输出是否相同,它仍然必须完成操作才能生成结果对象的哈希。

我觉得我错误地看待了这种方法的目的。etag是否只用于文件等静态资源,而不是各种流程的结果资源?例如,图像是电子标签的一个很好的用途,但像销售历史这样的报告呢?这是使用etags和普通缓存之间的分界线,还是我遗漏了一块?按场景举例确实会有所帮助。

您可以像您可能知道的任何其他缓存机制一样使用HTTP的ETag缓存机制。将其视为缓存密钥。您不从结果生成密钥,而是使用输入参数。

因此,让我们假设您拥有资源"/image?id=bob&dimension=100x100"。这将从数据库中获取Bob的照片,将其缩小到100x100并将其返回给客户端。与其对缩放后的图像进行散列,不如对输入参数进行散列:"bob"one_answers"100x100"。如果您的服务器收到该请求,它只需要检查Bob是否存在于数据库中并返回304。

最新更新