ASP.NET的緩存技術

介紹
大量的網站頁面是採用動態的方式,根據用戶提交的不同請求創建生成頁面。正如我們所知的,動態頁面有助於根據用戶要求來提供定製的動態內容。動態頁面也利於獲取在數據庫中每時每刻更新的資料。缺點是爲每個用戶請求生成同一頁面增加了系統開銷。

爲克服此問題,一些網站用頁面生成引擎對所有頁面生成html靜態頁面。但這樣生成的頁面對所有用戶的請求內容都是相同。

ASP.NET 提供了緩存技術有助於我們最大程度地解決這個問題。它能緩存輸出的頁面,保存在存儲器當中,緩存用戶請求的內容。緩存的特點可以根據不方式來定製的。

緩存一個頁面
爲緩存一個頁面輸出的內容,我們要在面面頂部指定一個 @OutputCache 命令。語法如下所示:

<%@ OutputCache Duration=5 VaryByParam="None" %>

如你所見,這條指令有兩個屬性。他們是:

Duration - 被緩存輸出的內容有效期是多少秒。在時間超過指定的有效期後,過期的緩存內容會刪除,並會在下次用戶請求中重新調用頁面生成緩存內容。再次的緩存內容過10秒後此過程又會重複。
VaryByParam - 這個屬性是必須的,並且指明查詢字串參數不同使緩存產生變化。在上面的代碼片斷中,我們指定 VaryByParam 屬性是 “None” ,這意味着不論傳遞的查詢字串參數如何不同所返回的頁面內容是相同的。
如果對同一頁面的兩次請求含不同的查詢字串參數,如:.../PageCachingByParam.aspx?id=12 和.../PageCachingByParam.aspx?id=15 ,這應該生成不同的頁面內容,指令應該是:

<%@ OutputCache Duration=10 VaryByParam="id" %>

對這樣兩種不同請求的頁面內容每一個都會被緩存 Duration 屬性指定的時間長度。。

爲了指定多個參數的情形,要使用分號來分隔參數名稱。如果我們指定 VaryByParam 屬性爲“*”,緩存內容會因傳遞的不同查詢字串參數而不同。

一些動態頁面要根據不同的瀏覽來生成不同的內容。在這種情況下就要規定緩存輸出內容要因不同瀏覽器而不同。@OutputCache 命令要改爲:

<%@ OutputCache Duration=5 VaryByParam="id" VaryByCustom="browser" %>

這條指令不僅讓緩存輸出內容因瀏覽器不同而不同,而且也會因瀏覽器版本不同而不同,如 IE5、IE 6、Netscape 4、Netscape 6 都會獲得不同輸出的緩存版本。


緩存局部頁面
有時我們可能只是想緩存一個頁面的一小部分。例如,我們可能用這樣的頁面,對所有瀏覽用戶都有同樣的內容,這個頁面有一個標題。這個標題可能是某個文本/圖象組成,並且每天數據都可能改變。在這種情況下,我們就會只想緩存這個標題一天的有效期。

解決方法是把標題內容放入一個用戶控件當中,然後指定這個用戶控件應該被緩存。這個技術被稱爲局部緩存(fragment caching)。

爲了指定應該被緩存的用戶控件,我們利用 @OutputCache 指令,就象整個頁面緩存的用法一樣。

<%@ OutputCache Duration=10 VaryByParam="None" %>

在上面的指令中,用戶控件緩存有效期是 Duration 屬性指定的時間(10 秒)。不論查詢字串和瀏覽器類型/版本如何,緩存輸出的內容是相同的。。


數據緩存
ASP.NET 也支持作爲對象類型數據的緩存。我們可以把對象存儲在內存中,在我們應用程序的不同動態頁面中使用它們。利用 Cache 類可以實現這個特點。緩存的生存週期與應用程序的相同。對象可以以鍵值對(name value pairs)的形式儲存於緩存當中。如下所示插入一個字串進緩存:

Cache["name"]="Smitha";

這個存儲的字串值可以象這樣得到:

if (Cache["name"] != null)
Label1.Text= Cache["name"].ToString();

爲把對象插入緩存中,可以使用 Cache 類的 Add 方法或者不同版本的 Insert 方法。這些方法可能允許我們使用這個 Cache 類提供的更強大功能,下面是利用了 Insert 方法的一個重載:

Cache.Insert("Name", strName,
new CacheDependency(Server.MapPath("name.txt"),
DateTime.Now.AddMinutes(2), TimeSpan.Zero);

頭兩個參數是是鍵名和被插入的對象。第三個參數是 CacheDependency 類型,幫我們對名爲 name.txt 文件設置值的依賴項。因此一旦這個文件發生改變,在緩存中的這個值會被刪除。我們可以指定 “null” 值來表明沒有依賴項。第四個參數指定了從緩存刪除這個值的時間。最後一個參數是緩存過期時間可調的參數,它指明瞭從最後一次訪問緩存時間到它被刪除的時間間隔。

當可用系統內存不多時,緩存自動從內存中刪除使用少的項目。這個過程被稱爲淨化(scavenging)。我們可以爲添加進緩存中的項目指定優先級,以便某些項目能得到優先處理:

Cache.Insert("Name", strName,
new CacheDependency(Server.MapPath("name.txt"),
DateTime.Now.AddMinutes(2), TimeSpan.Zero,
CacheItemPriority.High, null);

枚舉類型 CacheItemPriority 給成員設置不同的優先級。CacheItemPriority.High 給項目分配了個高優先級,以使該項目減少被緩存刪除的可能性。


要點
如果你還是老的 ASP 頁面並且利用 Response.Expires 屬性緩存頁面輸出,那麼他們也可以象 ASP.NET 支持這個屬性一樣被保留。
Cache 類的 Insert 方法會用相同鍵名的項目覆蓋任何已存在項目。
CacheItemPriority.NotRemovable 優先值可以與 Cache.Insert 方法一起用於設置一個項目的優先級,以便這個項目不會在淨化期間從緩存中被刪除

結語
本文中,我儘可能對 ASP.NET 的緩存技術多個可選方便提供一個總的概括。爲保持本文的簡短扼要沒有提供詳細的解釋和說明。

在一個啓用緩存的含子控件嵌套風格中可用局部緩存。我還沒有測試如何利用這一點,因此也就沒有包括這個技巧的說明。同時 Cache 類的 Insert 方法也就沒有在此討論了。我希望本文對讀者而言是一個研究多姿多彩的 ASP.NET 世界的一個良好的開端。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章