【问题标题】:Cache of Objects or Output in View: Which is better?对象缓存或视图中的输出:哪个更好?
【发布时间】:2011-02-25 12:16:17
【问题描述】:

我有一个在 ASP.Net MVC 中工作的电子商务。我正在使用缓存来提高我的页面性能并且它正在工作。

我会链接以了解什么提供更好的性能,例如,我可以在我的视图中设置 OutputCache 并将此缓存用于所有页面我可以在控制器中获取我的产品列表,将其放在缓存中(如下面的代码)并将其发送到 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);
        }

两者都有效,但我想知道提高性能的首选方法是什么,或者还有其他更好的方法吗?

【问题讨论】:

    标签: asp.net asp.net-mvc performance caching


    【解决方案1】:

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

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

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

    缓存是希望 MS 在 mvc 3 中改进的东西。

    【讨论】:

      【解决方案2】:

      在真正的 ASP.NET MVC 站点中,您几乎没有机会使用 OutPutCache。

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

      Phil Haack 写过关于甜甜圈缓存的文章,但事实证明它在 MVC2 中不可行 http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx

      我开始使用 OutputCaching 时经常没有考虑到每个人都忘记的这个用户特定的小细节。

      您可能会想:我可以通过做一些加载动态数据的 Javascript 来解决这个问题……对于面向公众的网站来说是个坏主意。有非 javascript 客户端,还有 google bot。

      首先我很害怕这可能会导致我们的高流量网站崩溃:但它通过将调用结果缓存到数据层中非常有效。

      【讨论】:

        【解决方案3】:

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

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

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

        但我建议您先进行调查 - 即在特定情况下哪个更适合您。不要过度使用其中之一,也不要过度使用两者!

        【讨论】:

          猜你喜欢
          • 2011-03-10
          • 2013-05-22
          • 1970-01-01
          • 1970-01-01
          • 2013-10-08
          • 2011-12-07
          • 1970-01-01
          • 2015-10-06
          • 2010-10-23
          相关资源
          最近更新 更多