让我们说,理论上,我在我的网站上有一个页面/控制器动作,它做了一些非常重的事情.完成它的操作大约需要10秒钟.
现在,我使用.NET的outputcache机制将其缓存15分钟(例如,我使用[OutputCache(Duration = 900)])如果15分钟后缓存过期并且100个用户再次请求页面,会发生什么?重型加工需要10秒钟?
>繁重的东西只是第一次完成,并且有一些锁定机制,以便其他99个用户将获得缓存结果
>沉重的东西完成了100次(服务器瘫痪,因为它可能需要100 * 10秒)
很容易问题,但我不是百分百肯定.我希望它是第一,但是:-)
谢谢!
解决方法
那么,这取决于你如何配置IIS.如果你的工作线程少于100个(假设是50个),那么“重物”会完成50次,使服务器瘫痪,然后剩下的50个请求将从缓存中提供.
但不,缓存的操作结果没有“锁定机制”;在大多数情况下,这会适得其反.
编辑:我相信这是真的,但尼克的测试说不然,我现在没有时间进行测试.亲自尝试一下!然而,答案的其余部分并不依赖于上述情况,我认为这更重要.
但是,一般来说,任何Web缓存或其他方式的请求都不需要10秒才能返回.如果我在你的鞋子里,我会以某种方式预先计算请求的难点部分.如果要缓存HTML,您仍然可以缓存操作结果,但听起来您的问题比这更大.
你可能也想要consider asynchronous controllers.最后,请注意虽然IIS和ASP.NET MVC不会锁定这个繁重的计算,但你可以.如果您使用异步控制器并结合锁定计算,那么您将有效地获得您要求的行为.如果不了解更多关于你做什么的话,我真的不能说这是最好的解决方案.