2010-07-21 183 views
5

我有一個ASP.Net 4.0 web應用程序,它非常頻繁地從數據庫加載數據並對其進行繁重的計算。我想將這些加載和準備好的數據緩存在中央緩存中,每個使用該應用程序的用戶和計算機都可以訪問這些緩存。ASP.Net緩存共享

簡單用例:

  • 用戶1訪問網頁時,高速緩存爲空,數據被加載/計算,數據被緩存
  • 用戶2訪問網頁時,高速緩存包含的數據,從高速緩存
  • 加載的數據
  • 用戶3訪問網頁時,高速緩存包含從高速緩存加載
  • 用戶數據,數據重新加載1網頁,緩存包含數據,數據從緩存中加載
  • 緩存過期
  • 用戶3刷新網頁,緩存爲空,數據加載/計算,數據緩存

我知道ASP.Net有一個內置的緩存機制。我不知道的是它是否可以在不同用戶同時訪問不同計算機上的不同用戶之間共享。 我也想知道系統在Web場環境中的行爲。

回答

9

雖然其他人所說內置的ASP.NET緩存(System.Web.Caching),請注意,.NET 4.0引入了一個全新的緩存框架設計到System.Web.Caching命名空間外工作:

System.Runtime.Caching

http://msdn.microsoft.com/en-us/library/system.runtime.caching(VS.100).aspx

現在,這更是一個禽獸不如簡單System.Web.Caching的緩存表項。但是,您獲得了擁有多個緩存存儲,鎖定緩存對象/鍵以及創建自己的外部緩存提供程序的可擴展性的優勢 - 例如Microsoft的新Velocity distributed caching system。它配有內置的MemoryCache提供程序。

這真的不是很難使用。直接從MSDN對第內置的MemoryCache提供商(同樣,你可以實現你自己的)的WinForms應用程序使用它(您想更改代碼爲您的Web應用程序):

http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

ObjectCache cache = MemoryCache.Default; 
string fileContents = cache["filecontents"] as string; 

if (fileContents == null) 
{ 
    CacheItemPolicy policy = new CacheItemPolicy(); 

    List<string> filePaths = new List<string>(); 
    filePaths.Add("c:\\cache\\example.txt"); 

    policy.ChangeMonitors.Add(new 
    HostFileChangeMonitor(filePaths)); 

    // Fetch the file contents. 
    fileContents = 
     File.ReadAllText("c:\\cache\\example.txt"); 

    cache.Set("filecontents", fileContents, policy); 
} 

Label1.Text = fileContents; 

我已經實現了NCache(如上所述)以及Memcached。我可以告訴你,微軟的Velocity真的是分區數據並在緩存分區內設置冗餘(非常酷)的方法。更何況,它是免費的!

2

是的,內置的ASP.NET緩存是在應用程序中的所有用戶(線程)之間共享的。

3

正如Eric所寫的,您可以使用ASP.NET的內置緩存來滿足您的需求 - 它是在您的Web應用程序的所有會話之間共享的。

如果你真的想(或需要)爲多臺機器(web farm)擁有一個通用緩存,那麼你需要一些分佈式緩存解決方案,例如, AppFabricNCache或類似的。