2010-05-29 29 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中進行改進。

相關問題