2014-10-28 76 views
0

我正在阅读有关HTTP缓存的Google性能文档,文档号为https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching,本文档指出我们应尽可能使用ETags。我正在使用ASP.NET Web Api 2.2。我现在正试图在我所有的公共API中实现ETag。我正在考虑使用MD5来实现ETag。我的意思是,我将使用MD5对每个请求散列json响应。对每个请求使用MD5.calculateHash是否有任何性能问题?我的json响应大小不太大(在1到20KB的范围内)。在ASP.NET Web API中使用MD5实现HTTP缓存Etag功能

回答

3

是的,会有性能问题。计算哈希需要时间。但是,您可能会发现,计算该散列的成本与通过将不变的字节传输到客户端所节省的性能相比并不显着。

但是,我们不能保证您能够通过Etags获得性能改善。这取决于很多事情。您是否要在每次请求时重新生成服务器上的Etag,以将其与传入请求进行比较?或者你打算创建一个etag值的缓存,并在资源更改时使它们失效?

如果您要在每个请求中重新生成etag,那么从数据库中提取数据并格式化表示的时间可能会大大超过在线路上发送几个字节所花费的时间。特别是如果整个表示可以适合单个网络数据包。

这里的关键在于询问您是否真的需要Etags的性能增益,并且这是否值得执行。通过设置缓存控制头来启用客户端专用缓存,可以为您提供所需的所有优势,而无需实施etags。

我有很多帖子说进入这个主题的详细信息:

+0

没有数据库交互。我只是在每个请求上使用MD5散列响应json,并将它与IfNoneMatch头进行比较?做这个的最好方式是什么?顺便说一句,Google建议使用ETags – user960567 2014-10-28 19:55:02

+0

@ user960567好吧,如果生成json响应的代价是零,那么生成哈希的代价可能低于通过线路发送字节的代价,所以返回Etag可能会使得感。 – 2014-10-28 20:04:00

+0

Darrel,坦率地说,我在所有公共API中使用Azure Redis Cache X分钟。因此,我首先要做的是检查redis缓存的响应,如果存在(或不存在从数据库中获取它),然后将其采用缓存控制max-age = X分钟和ETag头返回响应。在发送带IfNoneMatch的响应检查ETag之前。如果相同,则为200,否则为200.您如何看待这种方法? – user960567 2014-10-28 20:14:37