ASP.NET(MVC)Outputcache和并发请求

Raz*_*zie 9 asp.net asp.net-mvc outputcache

让我们说,理论上,我在我的网站上有一个页面/控制器动作,它做了一些非常重的事情.完成它的操作大约需要10秒钟.

现在,我使用.NET的outputcache机制将其缓存15分钟(例如,我使用[OutputCache(Duration = 900)])如果在15分钟后缓存过期并且100个用户在10秒内再次请求页面执行该操作,会发生什么情况重处理?

  1. 繁重的东西只是第一次完成,并且有一些锁定机制,以便其他99个用户将获得缓存结果
  2. 沉重的东西完成了100次(服务器瘫痪,因为它可能需要100*10秒)

很容易问题,但我不是百分百肯定.我希望它是第一,但是:-)

谢谢!

Cra*_*ntz 4

嗯,这取决于您如何配置 IIS。如果工作线程少于 100 个(假设是 50 个),那么“繁重的工作”就会执行 50 次,从而导致服务器瘫痪,然后剩下的 50 个请求将从缓存中得到服务。

但不,缓存的操作结果没有“锁定机制”;在大多数情况下,这会适得其反。

编辑:我相信这是真的,但尼克的测试表明不然,我现在没有时间测试。自己尝试一下吧!不过,其余的答案并不依赖于上述内容,我认为它更重要。

但一般来说,任何 Web 请求(无论是缓存的还是其他方式)都不应需要 10 秒才能返回。如果我处于你的立场,我会考虑以某种方式预先计算请求的困难部分。如果您想缓存 HTML,您仍然可以缓存操作结果,但听起来您的问题比这要大一些。

可能还想考虑异步控制器。最后,请注意,虽然 IIS 和 ASP.NET MVC 不会锁定这种繁重的计算,但您可以。如果您将异步控制器与计算锁定结合使用,那么您将有效地获得您所要求的行为。如果不了解您在做什么,我真的无法说这是否是最好的解决方案。