2010-05-29 74 views
2

我有一个在ASP.Net MVC工作的电子商务。我正在使用缓存来提高页面的性能,并且它正在工作。视图中的对象或输出缓存:哪个更好?

我想链接到知道什么提供了更好的性能,例如,我可以在我的意见设置的OutputCache和并使用该缓存的所有页面OR我能得到我的产品列表中的控制器,把它放在高速缓存(如下面的代码)并将其发送到View以呈现给用户?

private IEnumerable<Products> GetProductsCache(string key, ProductType type) 
     { 
      if (HttpContext.Cache[key] == null) 
       HttpContext.Cache.Insert(key, ProductRepository.GetProducts(type), null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration); 

      return (IEnumerable<Products>)HttpContext.Cache[key]; 
     } 

public ActionResult Index() 
     { 
      var home = new HomeViewModel() 
          { 
           Products = GetProductsCache("ProductHomeCache", ProductType.Product) 
           Services = GetProductsCache("ServiceHomeCache", ProductType.Service) 
          }; 

      return View(home); 
     } 

这两个工作,但我想知道什么是提高性能的首选方法,或者有其他更好的方法来做到这一点?

回答

1

在实际的ASP.NET MVC的网站,你将很难有使用的输出缓存的机会。

问题是没有保存方式来使用甜甜圈缓存。这意味着你缓存大部分页面,但是有一些你不需要缓存的用户特定部分。这适用于老派的ASP.NET。

菲尔哈克写甜甜圈缓存,但它竟然是在MVC2 http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx

通常我开始使用不可行OutputCaching没有想到这个小用户的具体细节大家forgott。

你可能会想:我能解决它通过这样做,加载动态数据......对于面向公众的网站坏主意一些JavaScript的东西。有非JavaScript客户端,并有谷歌机器人。

首先,我被吓坏了,这可能带给我们的高流量的网站了下来,但它工作得很好,通过缓存调用到数据层的结果。

1

OutputCache会给出更好的结果。但并不总是可以使用 - 例如,如果您有很多动态(用户特定的)控件。

当结果集用于许多视图时,缓存结果也是一种选择。您当前的实现是而不是缓存安全 - 即如果两个或多个线程同时获得if,哪一个会在保存结果时获胜?如果您选择这种方式,请使用ReaderWriterLockSlim保护您的缓存。

还要小心选择缓存时间!我建议你用缓存构建你的应用程序,但不要缓存,除非完全确定需要花费很多时间来执行(可能是你的方法需要改进?)。在您的项目准备就绪后,对其进行分析,并将缓存放在需要的地方!

但我建议你先查 - 即其中一个工作在特定情况下对你更好。不要过度使用一个在另一个,不要过度使用两个!

2

在你的例子中,正如Ivan指出的那样,输出缓存在性能方面会稍微好一点。但只是稍微。

根据我的经验,大部分性能提升都来自数据缓存。页面处理是一个相对便宜的操作,但是数据库调用不是。因此,我总是将我的数据gzip并转储到缓存中,当我将其从缓存中取出时进行膨胀。Hanselman有一个压缩缓存的好例子,如果你感兴趣的话:http://www.hanselman.com/blog/CommentView.aspx?guid=aa479008-3d1e-45fc-b89f-e9c2ffc199c1

另外,在mvc中的输出缓存可能有点棘手。要缓存整个页面是可以的,只需使用[OutputCache]属性即可。但是,如果您只想缓存部分内容(大部分时间都是这样),它会变得更复杂一些。

高速缓存希望MS可以在mvc 3中进行改进。

相关问题