【问题标题】:Implementing HTTP caching Etag feature using MD5 in ASP.NET Web Api在 ASP.NET Web Api 中使用 MD5 实现 HTTP 缓存 Etag 功能
【发布时间】:2014-10-28 17:54:48
【问题描述】:

我在https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching 阅读有关 HTTP 缓存的 Google 性能文档,该文档说我们应该尽可能使用 ETags。我正在使用 ASP.NET Web Api 2.2。我现在正在尝试在我的所有公共 api 中实现 ETag。我正在考虑使用 MD5 实现 ETag。我的意思是,我将使用 MD5 对每个请求的 json 响应进行哈希处理。在每个请求上使用 MD5.calculateHash 是否会对性能造成影响?我的 json 响应大小并不太大(在 1 到 20KB 范围内)。

【问题讨论】:

    标签: performance http asp.net-web-api


    【解决方案1】:

    是的,性能会受到影响。计算哈希需要时间。但是,您可能会发现,与通过线路将未更改的字节传输到客户端所节省的性能相比,计算该哈希的成本并不显着。

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

    如果您要在每个请求上重新生成 etag,那么从数据库中提取数据和格式化表示所花费的时间可能会明显高于通过网络发送几个字节所花费的时间。特别是如果整个表示可以放入单个网络数据包中。

    这里的关键是询问您是否真的需要 Etags 的性能提升,是否值得为此付出代价。设置缓存控制标头以启用客户端私有缓存可以为您提供所需的所有好处,而无需实现 etags。

    我有一些帖子更详细地介绍了这个主题:

    【讨论】:

    • 没有数据库交互。我只是在每个请求上使用 MD5 对响应 json 进行哈希处理并将其与 IfNoneMatch 标头进行比较?做这个的最好方式是什么?顺便说一句,谷歌推荐使用 ETags
    • @user960567 好吧,如果生成 json 响应的成本为零,那么生成哈希的成本可能低于通过线路发送字节的成本,因此返回 Etag 可能会使感觉。
    • Darrel,坦率地说,我在 X 分钟内将 Azure Redis 缓存用于我的所有公共 API。所以,我首先要做的是检查 redis 缓存的响应,如果存在(或不存在从 db 中获取它)然后获取它并返回带有缓存控制 max-age=X 分钟和 ETag 标头的响应。在发送响应之前,请使用 IfNoneMatch 检查 ETag。如果相同则为 304,否则为 200。您如何看待这种方法?
    • @user960567 可以说 Redis 缓存不会提供任何好处。 Max-age=x 应该消除在时间 x 之前对服务器的任何请求。所以当服务器收到请求时,redis 缓存就已经过期了。到那时,每个服务器请求都将发送到数据库,我们不禁要问 Etag 实际上为这项工作带来了多少价值。就个人而言,我不会增加 Etags 的复杂性,直到您可以看到生产中的活动会从中受益。
    • Redis 缓存在所有用户之间,与 http 客户端缓存无关,它是为单个用户使用的。通过实施 Redis 缓存,我们的生产得到了巨大的改进。
    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多