caching與緩存

一般,應用程序能夠將那些頻繁訪問的數據,以及那些須要大量處理時間來建立的數據存儲在內存中,從而提升性能。例如,若是應用程序使用複雜的邏輯來處理大量數據,而後再將數據做爲用戶頻繁訪問的報表返回,避免在用戶每次請求數據時從新建立報表能夠提升效率。一樣,若是應用程序包含一個處理複雜數據但不須要常常更新的頁,則在每次請求時服務器都從新建立該頁會使工做效率低下。 web

在這些狀況下,爲了幫助您提升應用程序的性能,ASP.NET 使用兩種基本的緩存機制來提供緩存功能。第一種機制是應用程序緩存,它容許您緩存所生成的數據,如 DataSet 或自定義報表業務對象。第二種機制是頁輸出緩存,它保存頁處理輸出,並在用戶再次請求該頁時,重用所保存的輸出,而不是再次處理該頁。 sql

應用程序緩存數據庫

應用程序緩存提供了一種編程方式,可經過鍵/值對將任意數據存儲在內存中。使用應用程序緩存與使用應用程序狀態相似。可是,與應用程序狀態不一樣的是,應用程序緩存中的數據是易失的,即數據並非在整個應用程序生命週期中都存儲在內存中。使用應用程序緩存的優勢是由 ASP.NET 管理緩存,它會在項過時、無效、或內存不足時移除緩存中的項。還能夠配置應用程序緩存,以便在移除項時通知應用程序。有關更多信息,請參見緩存應用程序數據編程

使用應用程序緩存的模式是,肯定在訪問某一項時該項是否存在於緩存中,若是存在,則使用。若是該項不存在,則能夠從新建立該項,而後將其放回緩存中。這一模式可確保緩存中始終有最新的數據。 緩存

頁輸出緩存服務器

頁輸出緩存在內存中存儲處理後的 ASP.NET 頁的內容。這一機制容許 ASP.NET 向客戶端發送頁響應,而沒必要再次通過頁處理生命週期。頁輸出緩存對於那些不常常更改,但須要大量處理才能建立的頁特別有用。例如,若是建立大通訊量的網頁來顯示不須要頻繁更新的數據,頁輸出緩存則能夠極大地提升該頁的性能。能夠分別爲每一個頁配置頁緩存,也能夠在 Web.config 文件中建立緩存配置文件。利用緩存配置文件,只定義一次緩存設置就能夠在多個頁中使用這些設置。 框架

頁輸出緩存提供了兩種頁緩存模型:整頁緩存和部分頁緩存。整頁緩存容許將頁的所有內容保存在內存中,並用於完成客戶端請求。部分頁緩存容許緩存頁的部份內容,其餘部分則爲動態內容。有關更多信息,請參見緩存 ASP.NET 頁性能

部分頁緩存可採用兩種工做方式:控件緩存和緩存後替換。控件緩存有時也稱爲分段緩存,這種方式容許將信息包含在一個用戶控件內,而後將該用戶控件標記爲可緩存的,以此來緩存頁輸出的部份內容。這一方式可緩存頁中的特定內容,並不緩存整個頁,所以每次都需從新建立整個頁。例如,若是要建立一個顯示大量動態內容(如股票信息)的頁,其中有些部分爲靜態內容(如每週總結),這時能夠將靜態部分放在用戶控件中,並容許緩存這些內容。 網站

緩存後替換與控件緩存正好相反。這種方式緩存整個頁,但頁中的各段都是動態的。例如,若是要建立一個在規定時間段內爲靜態的頁,則能夠將整個頁設置爲進行緩存。若是向頁添加一個顯示用戶名的 Label 控件,則對於每次頁刷新和每一個用戶而言,Label 的內容都將保持不變,始終顯示緩存該頁以前請求該頁的用戶的姓名。可是,使用緩存後替換機制,能夠將頁配置爲進行緩存,但將頁的個別部分標記爲不可緩存。在此狀況下,能夠向不可緩存部分添加 Label 控件,這樣將爲每一個用戶和每次頁請求動態建立這些控件。有關更多信息,請參見 緩存 ASP.NET 頁的某些部分ui

根據請求參數緩存頁

除緩存頁的單一版本外,ASP.NET 頁輸出緩存還提供了一些功能,能夠建立根據請求參數的不一樣而不一樣的頁的多個版本。有關更多信息,請參見 緩存頁的多個版本

自動移除數據

出於如下緣由之一,ASP.NET 能夠從緩存中移除數據:

  • 因爲服務器上的內存不足,開始一個稱爲"清理"的過程。
  • 因爲緩存中的項已過時。
  • 因爲項的依賴項發生了更改。

爲了幫助管理緩存項,在將項從緩存中移除時,ASP.NET 會通知應用程序。

清理

清理是在內存不足時從緩存中刪除項的過程。若是某些項在一段時間內未被訪問,或是在添加到緩存中時被標記爲低優先級,則這些項會被移除。ASP.NET 使用 CacheItemPriority 對象來肯定要首先清理的項。有關更多信息,請參見如何:將項添加到緩存中

過時

除了清理外,在緩存項過時時,ASP.NET 會自動從緩存中移除這些項。向緩存添加項時,能夠按下表中的描述設置其過時時間。

過時類型

說明

可調過時

指定某項自上次被訪問後多長時間過時。例如,能夠將某項設置爲自上次在緩存中被訪問後 20 分鐘過時。

絕對過時

指定某項在設定的時間過時,而不考慮訪問頻率。例如,能夠將某項設置爲在 6:00 PM 過時,或四小時後過時。

   

   

依賴項

能夠將緩存中某一項的生存期配置爲依賴於其餘應用程序元素,如某個文件或數據庫。當緩存項依賴的元素更改時,ASP.NET 將從緩存中移除該項。例如,若是您的網站顯示一份報告,該報告是應用程序經過 XML 文件建立的,您能夠將該報告放置在緩存中,並將其配置爲依賴於該 XML 文件。當 XML 文件更改時,ASP.NET 會從緩存中移除該報告。當代碼請求該報告時,代碼會先肯定該報告是否在緩存中,若是不在,代碼會從新建立該報告。所以,始終都有最新版本的報告可用。

ASP.NET 緩存支持下表中描述的依賴項。

依賴項

說明

鍵依賴項

應用程序緩存中的項存儲在鍵/值對中。鍵依賴項容許項依賴於應用程序緩存中另外一項的鍵。若是移除了原始項,則具備鍵依賴關係的項也會被移除。例如,能夠添加一個名爲 ReportsValid 的緩存項,而後緩存若干個依賴於 ReportsValid 鍵的報告。當ReportsValid 項被移除時,全部依賴於它的緩存報告一樣也會從緩存中移除。

文件依賴項

緩存中的項依賴於外部文件。若是該文件被修改或刪除,則緩存項也會被移除。

SQL 依賴項

緩存中的項依賴於 Microsoft SQL Server 200五、SQL Server 2000 或 SQL Server 7.0 數據庫中表的更改。對於 SQL Server 2005,緩存中的項可依賴於表中的某一行。有關更多信息,請參見 使用 SqlCacheDependency 類在 ASP.NET 中緩存

聚合依賴項

經過使用 AggregateCacheDependency 類緩存中的項依賴於多個元素。若是任何依賴項發生更改,該項都會從緩存中移除。

自定義依賴項

能夠用您本身的代碼建立的依賴關係來配置緩存中的項。例如,能夠建立一個自定義 Web 服務緩存依賴項,當調用 Web 服務獲得一個特定值時,該依賴項就會從緩存中移除數據。

   

   

應用程序緩存項移除通知

當項從應用程序緩存中移除時,您能夠收到通知。例如,若是有一個須要大量處理時間才能建立的項,當從緩存中移除該項時,您會收到通知以即可以當即替換該項。這樣,下次請求該項時,用戶便沒必要等待處理該項。有關更多信息,請參見如何:從緩存中移除項時通知應用程序

   

在ASP.NET MVC中,Cache可從HttpContext訪問,它是System.Web.Cache的一個實例,目前公司框架中在Web應用時的緩存也是使用這個Cache類

   

緩存添加

Cache["CacheItem1"] = "Cached Item 1";

Cache.Insert("CacheItem2", "Cached Item 2");

//CacheedItem9的值爲"Cached Item 9"

string CachedItem9 = (string)Cache.Add("CacheItem9",

"Cached Item 9", null,

System.Web.Caching.Cache.NoAbsoluteExpiration,

System.Web.Caching.Cache.NoSlidingExpiration,

System.Web.Caching.CacheItemPriority.Default,

null);  

經過指定依賴項向緩存添加項

string[] dependencies = { "CacheItem2" };

Cache.Insert("CacheItem3", "Cached Item 3",

new System.Web.Caching.CacheDependency(null, dependencies));

   

Cache.Insert("CacheItem4", "Cached Item 4",

new System.Web.Caching.CacheDependency(

Server.MapPath("XMLFile.xml"))); 

添加多個依賴項

System.Web.Caching.CacheDependency dep1 =

new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml"));

string[] keyDependencies2 = { "CacheItem1" };

System.Web.Caching.CacheDependency dep2 =

new System.Web.Caching.CacheDependency(null, keyDependencies2);

System.Web.Caching.AggregateCacheDependency aggDep =

new System.Web.Caching.AggregateCacheDependency();

aggDep.Add(dep1);

aggDep.Add(dep2);

Cache.Insert("CacheItem5", "Cached Item 5", aggDep);

 

 

將設有過時策略的項添加到緩存中

//下面的代碼示例將有一分鐘絕對過時時間的項添加到緩存中:即緩存會在插入後一分鐘過時

Cache.Insert("CacheItem6", "Cached Item 6",

null, DateTime.Now.AddMinutes(1d),

System.Web.Caching.Cache.NoSlidingExpiration);
//下面的代碼示例將有 10 分鐘彈性過時時間的項添加到緩存中:即緩存會最後一次訪問的10分鐘後過時,如每在10分鐘內都訪問一次,緩存則不會過時。

Cache.Insert("CacheItem7", "Cached Item 7",

null, System.Web.Caching.Cache.NoAbsoluteExpiration,

new TimeSpan(0, 10, 0));

 

將設有優先級設置的項添加到緩存中

//下面的代碼示例將優先級值爲 High 的項添加到緩存中:

Cache.Insert("CacheItem8", "Cached Item 8",

null, System.Web.Caching.Cache.NoAbsoluteExpiration,

System.Web.Caching.Cache.NoSlidingExpiration,

System.Web.Caching.CacheItemPriority.High, null);   

要從緩存中檢索數據,應指定存儲緩存項的鍵。不過,因爲緩存中所存儲的信息爲易失信息,即該信息可能由 ASP.NET 移除,所以建議的開發模式是首先肯定該項是否在緩存中。若是不在,則應將它從新添加到緩存中,而後檢索該項。

   

檢索緩存項的值  

string cachedString;

cachedString = (string)Cache["CacheItem"];

if (cachedString == null)

{

cachedString = "Hello, World.";

Cache.Insert("CacheItem", cachedString);

}

 

ASP.NET 緩存中的數據是易失的,即不能永久保存。因爲如下任一緣由,緩存中的數據可能會自動移除:

  • 緩存已滿。
  • 該項已過時。
  • 依賴項發生更改。

   

從緩存中顯式刪除項

Cache.Remove("MyData1");   

從緩存中移除項時通知應用程序

//在Add方法中添加有個參數是傳入一個CacheItemRemovedCallback的委託,這個委託在緩存被清理時調用,

Cache.Add("MyReport",

CreateReport(), null, DateTime.MaxValue,

new TimeSpan(0, 1, 0),

System.Web.Caching.CacheItemPriority.Default,

ReportRemovedCallback);   

委託的定義以下,CacheItemRemovedReason是一個枚舉,傳遞緩存被移除的緣由,

public delegate void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason);

 

在Web.Config中,對緩存設置以下

<caching>

<!--定義全局應用程序緩存設置。-->

<cache

<!-- 是否當計算機處於內存壓力下時是否禁止執行緩存內存回收。-->

disableMemoryCollection = "false"

<!--是否禁用緩存過時。若是禁用,則緩存項不會過時,而且不會對過時緩存項執行後臺清理。

-->

disableExpiration = "false"

<!--指示在緩存開始刷新過時項並嘗試回收內存以前應用程序的最大專用字節大小。此限制同時包括緩存所使用的內存量以及運行應用程序的正常內存開銷。若是設置爲零,則指示 ASP.NET 將使用本身的試探法肯定什麼時候開始回收內存。

-->

privateBytesLimit = "0"

<!--指示在緩存開始刷新過時項並嘗試回收內存以前應用程序可以使用的最大計算機物理內存百分比。該內存使用率同時包括緩存使用的內存以及正運行的應用程序的正常內存使用率。若是設置爲零,則指示 ASP.NET 將使用本身的試探法肯定什麼時候開始回收內存。-->

percentagePhysicalMemoryUsedLimit = "90"

<!--指示兩次輪詢應用程序專用字節內存使用量之間的時間間隔。

-->

privateBytesPollTime = "00:02:00"/>

   

<outputCache enableOutputCache = "true"

enableFragmentCache = "true"

sendCacheControlHeader = "true"

omitVaryStar = "false" >

</outputCache><!--指定應用程序範圍的輸出緩存設置。-->

   

<outputCacheSettings>

<outputCacheProfiles>

<add name = ""

enabled = "true"

duration = "-1"

location = ""

sqlDependency = ""

varyByCustom = ""

varyByControl = ""

varyByHeader = ""

varyByParam = ""

noStore = "false"/>

</outputCacheProfiles>

</outputCacheSettings><!--指定能夠應用於應用程序中頁的輸出緩存設置。-->

   

<outputCacheSettings>

<outputCacheProfiles>

<clear />

</outputCacheProfiles>

</outputCacheSettings>

   

<sqlCacheDependency enabled = "true"

pollTime = "60000">

<databases>

<add name = ""

connectionStringName = ""

pollTime = "60000"/>

</databases>

</sqlCacheDependency><!--爲 ASP.NET 應用程序配置 SQL 緩存依賴項。-->

   

</caching>

 

針對上面以介紹應用程序緩存爲主。只有cache節點對其有影響。

相關文章
相關標籤/搜索