2014-08-28 45 views
0

設置

.NET 4.5,.NET MVC 4,IIS 8,C#將.NET用於Web應用程序時,如何在根(應用程序)級別緩存數據?

背景

我一直在使用HttpContext.Current.Cache多年緩存以提高性能爲單個用戶會話構造的對象。這很好。

現在我需要在根級別緩存構造對象,以便任何瀏覽器中的任何用戶請求一個應該被緩存的信息的頁面,將從緩存中獲取該數據,而不是從數據中提取數據的新構造對象從後端。

因此,我將緩存從HttpContext.Current.Cache更改爲HttpRuntime.Cache。下面是添加對象緩存的例子:

/// <summary> 
    ///  Insert value into the cache using 
    ///  appropriate name/value pairs 
    /// </summary> 
    /// <typeparam name="T">Type of cached item</typeparam> 
    /// <param name="o">Item to be cached</param> 
    /// <param name="key">Name of item</param> 
    public static void Add<T>(T o, string key) 
    { 
     if (!string.IsNullOrEmpty(key)) 
     { 
      // NOTE: Apply expiration parameters as you see fit. 
      HttpRuntime.Cache.Insert(
       key, 
       o, 
       null, 
       DateTime.Now.AddDays(30), 
       Cache.NoSlidingExpiration); 
     } 
    } 

的問題

實施在此之後,我裝我在Chrome桌面上的一個網頁,並期待它作爲第一個請求需要調用加載緩慢數據庫並構造我的對象。

然後,我去了另一臺電腦,並調用相同的頁面,並花了很長時間!在每個不同PC /瀏覽器上發出第一個請求後,它應該會很快照亮。這表明我的對象仍按每個會話進行緩存。

一個可能性

如果沒有人察覺明顯的錯誤我已經作出,如果可能我的問題是由於服務器集羣分發應用程序,我想知道。所以,如果有人對此有所瞭解,我正在使用Rackspace雲託管。

回答

0

很確定你會發現HttpContext.Current.Cache不是用戶特定的。這就是Session。這裏說...

Difference between HttpRuntime.Cache and HttpContext.Current.Cache?

...有使用HttpContext.Current.Cache和HttpRuntime.Cache之間沒有什麼區別。

我建議發生的事情是每個客戶端緩存HTML /圖像等。另一種可能性是,您的應用程序在服務器場中,在這種情況下,如果您的第二個用戶碰到不同的機器,那麼緩存會不被填充,緩存對於每臺機器都是本地的。

我建議你需要使用某種性能工具來真正確定你的應用程序正在發生什麼。以下是性能分析

How to analyze the performance of requests in ASP.NET MVC application?

你也可以使用像fiddlercharles proxy一種工具來幫助您確定的時間是要在客戶端上進行討論。

您可能還需要考慮一個日誌記錄工具,您應該能夠從日誌記錄信息中輕鬆判斷您的緩存是否被命中,或者您是否正在從數據庫加載數據,猜測通常不是您通常會做的事情。我使用Log4net ...

http://www.codeproject.com/Articles/14819/How-to-use-log-net

http://logging.apache.org/log4net/

它具有例如記錄的許多不同的裝置電子郵件,日誌文件,數據庫表等等。