全面認識一下.NET 4的緩存功能

作者: 阿不  來源: 博客園  發布時間: 2010-07-22 10:21  閱讀: 6890 次  推薦: 2   原文鏈接   [收藏]  

  很多關于.NET 4.0新特性的介紹,緩存功能的增強肯定是不會被忽略的一個重要亮點。在很多文檔中都會介紹到在.NET 4.0中,緩存功能的增強主要是在擴展性方面做了改進,改變了原來只能利用內存進行緩存的局限,允許用戶在不改變代碼的情況下通過修改配置的方式,靈活的切換緩存介質。Cache Provider是可擴展的,開發人員可以方便的將緩存存放在文件中,也可以擴展使用分布式緩存。然而,由于之前已經有System.Web.Caching.Cache這個緩存對象的存在,讓我一直對.NET 4.0的新的Cache和原來已存在的System.Web.Caching.Cache的關系產生了一定的迷惑。通過這一兩天的研究,讓我慢慢解開了這層迷惑。

  回顧.NET 4.0以前的緩存功能

  事實上,在.NET4.0以前并沒有存在一個實際意義上的.NET Framework的緩存框架,實際上它是一個專為ASP.NET設計的緩存框架。在ASP.NET中,緩存分為兩種:輸出緩存(Output Cache)和數據緩存。輸出緩存是用在需要對已經生成好的頁面HTML或頁面中部分HTML(User Control)進行緩存,減少某些靜態內容的生成次數,從而提高請求響應時間。數據緩存,是開發人員希望緩存某些常用、并且極少更新的數據,讓這些數據緩存在內存中,以減少數據的讀取次數,從而提高程序的性能。而這兩種緩存都是使用System.Web.Caching.Cache來緩存數據。

  System.Web.Caching.Cache

  它是一個內存緩存的實現,并不提供緩存介質的擴展,數據直接緩存在內存中。這個對象一般情況下,我們不會自己去實例化。通常在頁面里面,我們會直接使用Page.Cache進行緩存操作,而不會去關心它是如何被實例化的。而在頁面以外的地方要使用緩存,我們可以通過全局的System.Web.Context.Current.Cache來進行緩存操作,同樣的你還可以使用System.HttpRuntime.Cache。其實如果我們通過Reflector去追蹤這幾個對象的關系,你不難發現雖然有這么多地方都有Cache對象,實際上它們都是引用同一個對象,那就是HttpRuntime.Cache這個對象。特別要注意的是,System.HttpRuntime.Cache不僅僅可用于Web環境下,它也可以在任何程序中使用,包括WinForm,Console Application,但是前提是你必須引用System.Web.dll。這也就說明了,System.Web.Caching.Cache這個對象完全是可以脫離于System.Web這個名稱空間,而作為一個獨立的緩存框架而存在。這也是我迷惑的第一個地方:System.Web.Caching.Cache會不會改變現有的實現,而直接使用新的可擴展的緩存框架?

  .NET 4.0中的緩存功能全解析

  .NET 4.0的緩存功功由三部分組成:System.Runtime.Caching,System.Web.Caching.Cache和Output Cache。下面分別對這三者以及它們之前的關系進行解析:

  System.Runtime.Caching

  這是在.NET 4.0中新增的緩存框架,存在于程序集System.Runtime.Caching.dll,在這份PPT中提到的System.Caching指的就是它。它是一個可擴展的數據緩存框架,內置提供了內存緩存的實現MemoryCache。但是它在使用上卻不是那么可擴展,除了提供ObjectCache這個抽象類外,并沒有提供可擴展的配置方案,我們無法通過配置方案來切換ObjectCache的實現,我們必須在代碼里面硬編碼我們要使用的ObjectCache實現:

 
ObjectCache objectCache = MemoryCache.Default;//

  System.Runtime.Caching.Configuration里面的配置也是針對MemoryCache。這些配置意義在于指定每個MemoryCache實例運行的內存使用配額方案,和配額檢查周期。MemoryCache.Default的實例名稱為“Default”,這樣我們就可以通過下面的配置來更改MemoryCache.Default的內存配額: 

 
<system.runtime.caching>
<memoryCache>
<namedCaches>
<add name="Default" cacheMemoryLimitMegabytes="10" pollingInterval="00:02:00"/>
</namedCaches>
</memoryCache>
</system.runtime.caching>

  緩存過期策略與其它的緩存框架大同小異,與System.Web.Caching.Cache的不同只是名稱不叫CacheDependency,而叫ChangeMonitor,并且提供了基于文件和目錄的緩存依賴策略。

  System.Web.Caching.Cache

  原先我一直在找答案,System.WebCaching.Cache底層是否改為使用System.Runtime.Caching,得到的結果是它沒有任何的變化。

  Output Cache

  Output Cache有了比較大的變化,ASP.NET 4.0之前的版本都是直接使用System.Web.Caching.Cache來緩存HTML片段。在ASP.NET 4.0中對它進行了重新設計,提供了一個OutputCacheProvider供開發人員進行擴展,但是它默認情況下,仍然使用System.Web.Caching.Cache來做做緩存。關于ASP.NET 4.0的Output Cache的使用,請參考ScottGU文章

  以上,我們可以得出的結果是,System.Runtime.Caching和Output Cache是可擴展的。并且,他們二者之間沒有任何關系,提供的擴展接口差別也非常大,需要分別進行實現。System.Runtime.Caching完全可以用于替代Enterprise Library Cache Application Block的作用,并且微軟所發布的分布式緩存框架Windows Server AppFabric應該已經提供了System.Runtime.Caching的擴展。

2
0
 
標簽:.NET4 緩存
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()