天天看點

一起談.NET技術,全面認識一下.NET 4的緩存功能

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

  事實上,在.NET4.0以前并沒有存在一個實際意義上的.NET Framework的緩存架構,實際上它是一個專為ASP.NET設計的緩存架構。在ASP.NET中,緩存分為兩種:輸出緩存(Output Cache)和資料緩存。輸出緩存是用在需要對已經生成好的頁面HTML或頁面中部分HTML(User Control)進行緩存,減少某些靜态内容的生成次數,進而提高請求響應時間。資料緩存,是開發人員希望緩存某些常用、并且極少更新的資料,讓這些資料緩存在記憶體中,以減少資料的讀取次數,進而提高程式的性能。而這兩種緩存都是使用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的緩存功功由三部分組成:System.Runtime.Caching,System.Web.Caching.Cache和Output Cache。下面分别對這三者以及它們之前的關系進行解析:

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.WebCaching.Cache底層是否改為使用System.Runtime.Caching,得到的結果是它沒有任何的變化。

繼續閱讀