楊永國 何樹有
91550部隊 遼寧 116023
緩沖(caching)技術在現在的網站建設中的作用顯得相當重要,由于目前的技術大多是在客戶端瀏覽器發出請求時,動態的生成可瀏覽網頁,如靜態HTML網頁,然后將根據請求生成的網頁傳回瀏覽器,關于動態生成網頁的優勢長處,想必都有所了解,但是,我們現在要考慮的是如何降低這種技術帶來的對性能的更高要求,這種動態生成技術的流行使得對網站的服務器性能要求較高,是因為需要實時的根據瀏覽器的請求生成網頁,在生成復雜網頁或是頻繁生成相同的頁面時,問題顯得尤為嚴重。ASP.NET提供了一種在內存中開辟緩沖區的機制,很好地解決了上述問題。
ASP.NET為網絡應用程序提供了三種緩沖方式,利用在內存中開辟的緩沖區將難以動態生成的頁面和訪問頻率較高的頁面或是重要的內容放入緩沖區,當網絡應用程序發出請求時,將保存的內容傳給瀏覽器或是應用程序,從而降低了服務器的工作負荷。
頁面輸出緩沖是通過保存已生成的動態頁面來提高請求和響應的吞吐量,頁面緩沖是默認允許的,但是,對于已給定的響應,輸出是不加以緩沖的,除非是有直接的代碼說明為響應提供頁面輸出緩沖。
要為響應提供輸出緩沖,需指定緩沖區中內容的有效期和建立有訪問權限的公有緩沖,這可以通過OutputCache API實現或是使用@OutputCache指令來完成,當緩沖區建立以后,第一次的 GET請求會為緩沖區開辟一個入口,以后的GET請求或是 HEAD請求都利用這個入口來并行地利用輸出緩沖的,只要緩沖區中留有請求的內容,輸出緩沖是利用有效期來管理緩沖區中的頁面的,假設在緩沖區中有一個頁面被標記上有效期并且有效期是 60分鐘,那么當這個頁面在緩沖區中停留的時間超過60分鐘時就會被清理出緩沖區。如果此時請求這個頁面 那么這個被清理出緩沖區的頁面就會根據請求重新創建,然后又一次放入緩沖區標記上新的有效期,這種類型的有效期就是絕對有效期,也就是頁面在緩沖區中被保留的時間使用指令@OutputCache聲明有效期是:
<%@ OutputCache Duration="60" VaryByParam="none"%>
其中,參數Duration是以秒為單位的,Duration =“60”指定了有效期是60秒,參數 VaryByParam指明頁面不會被GET或是POST指令改變。
聲明有效期的方法還可以通過 HttpCachePolicy類來實現,由HttpResponse.Cache 屬性可以得到關于緩沖內容的說明,比如有效期可否被修改等。
在將網頁整頁地放入緩沖區變得不現實時,ASP.NET 提供了將網頁的一部分放入緩沖區的方法,頁面部分緩沖。事實上,頁面部分緩沖也可以看成頁面輸出緩沖的一種。使用頁面部分緩沖,首先要將網頁中放入緩沖區的部分分離出來。在網頁中使用user control來說明需要緩沖的部分,然后使用@OutputCache 指令標記出這些部分,為這些部分確定有效期等屬性。
@OutputCache指令一共有6個屬性:
Duration:以秒為單位,指定有效期的時間長度。這是必須的屬性。因為任何輸出緩沖中的內容都要指定有效期,部分緩沖也是一樣。
Location:取值限于枚舉集OutputCacheLocation的ANY、Client、Downstream、Server和None五種枚舉值,默認值是ANY。當輸出緩沖區中的 ASP.NET頁面和用戶控件(user control)時,這個屬性是必須的。
取Client值時,輸出緩沖定位于發送請求的客戶瀏覽器。取Server值時,定位于處理請求的服務器。取 Downstream時,輸出緩沖定位于處理請求的服務器的下傳流。
如果取ANY,那么上面三種情況都是允許的。取None則請求頁面的輸出緩沖沒有被激活,也就是說沒有輸出緩沖可用。
VaryByCustom:當VaryByCustom取browser值時,根據瀏覽器的名字和主要的版本信息改變緩沖區內容。如果屬性值為自定義的字符串,就必須在應用程序的Global.asax文檔中重定義HttpApplication.GetVaryByCustomString方法。
VaryByHeader:根據http頭信息來改變緩沖區內容。當有多重頭信息時,輸出緩沖中會為每個指定的HTTP 頭信息保存不同的頁面文檔。VaryByHeader屬性可以應用于緩沖所有http/1.1的緩沖內容,不僅僅是ASP.NET的緩沖。
但是 VaryByHeader屬性不支持@OutputCache指令對user control的標記,我們在這里只是提一下這個屬性,已使你能獲得對@OutputCache指令的全面認識。
當瀏覽器請求該頁面時,創建表單后,將需要緩沖的部分放入緩沖區。再次請求時,會判斷請求頁面中是否有緩沖區中的頁面部分,如果判斷結果是肯定的,那么將創建請求頁面的其他部分,再加上緩沖區中的內容合成請求頁面,作為請求的響應將頁面傳回瀏覽器。如果請求的頁面在緩沖區中沒有部分緩沖頁面,那么將再次創建請求頁面傳回瀏覽器,并且再次根據@OutputCache 指令將user control部分放入緩沖區中。
除了上述的兩種緩沖方法以外,ASP.NET還提供一種強大的,易于操作的緩沖機制—數據緩沖。數據緩沖可以在緩沖區中為每個應用程序保存各種對象,這些對象可以根據http的請求被調用。緩沖區對于各個不同的應用程序來說是私有的。
在ASP.NET中,數據緩沖是通過Cache類來實現的。每個應用程序的緩沖區實際上就是Cache類的一個實例。每個應用程序的生存周期就是這個緩沖實例的生存周期。當應用程序重新運行時Cache類實例會重建。通過Cache類的方法,可以將數據對象放入緩沖區中,然后再根據關鍵字匹配尋找到并加以利用這些對象。
Cache類提供了一個接口,通過這個接口可以完全控制要緩沖的內容,并且可以規定緩沖的時間和方式,一個簡單的添加緩沖對象的例子是:
Cache["keyname"] = keyValue;
然后重新找到這個對象,對這個對象的訪問是:
keyValue = Cache["keyname"];
if(keyValue != null ) { DisplayData(keyValue); }
在ASP.NET中,主要有三種數據緩沖方式:
(1)清除廢物(Scavenging)
當系統的內存資源緊張時,將最不常用的和不重要的內容清除出緩沖區,把內存用來處理頻繁訪問的方法稱為清除廢物的緩沖方式。這種方法在緩沖技術中很常見,比如內存的緩沖 Cache。這種方法保證了在緩沖區中的都是重要的和常用的內容。
使用這種方法需要在將對象放入緩沖區時,為這些對象標記優先級和必需的訪問頻率。
當需要清除廢物時,根據對象的優先級來判斷哪些是不重要的內容,根據指定的訪問頻率判斷哪些內容的訪問頻率達不到指定的頻率,然后將這些內容清除出內存緩沖區。
實現上,在使用Cache.Add和Cache.Insert方法向緩沖區中加入對象時,可以指定其優先級,優先級一共有6種,由小到大依次為:Low、BelowNormal、Normal、AboveNormal、High和NotRemoveable。默認值是Normal。
(2)有效期
在使用Add 和Instert方法時,還可以為添加的內容標上有效期,通過有效期來判斷哪些內容應該被清出緩沖區,這和輸出緩沖的方法類似,超過有效期的內容將會被清除出去。Add和Insert方法有兩個參數來說明這個方法:
DateTime指定了有效期的時間,可以是絕對時間,比如每天1:00也可以是相對時間,比如從創建開始的30秒。
TimeSpan 決定了創建對象的時間間隔。當對象被清出緩沖區時,所有對該對象的請求都會得到 null,直到對象再次創建并加入到緩沖區中。
(3)關鍵字匹配
ASP.NET允許根據外部文件,目錄或其他的緩沖內容來確定要緩沖的內容,這樣就造成了一種依賴關系,可以是依賴外部文件或是依賴關鍵字。當這種依賴關系改變時,緩沖區中的內容就是無效的,需要被清出內存。這種方法可以有效地更新緩沖區中的內容,尤其是當緩沖內容的數據源被修改時,使用這種方法可以根據這種依賴關系來更新緩沖內容,將修改前的數據作為無效內容清除出內存。
三種方法各有所長,可以根據不同的需要來選擇數據緩沖的方法,下面對數據緩沖的類Cache類中的Add和Insert方法進行實例分析。
Add 方法的使用示例:
Cache.Add(key, value, null, DateTime.Now.AddSeconds (15),t,
CacheItemPriority.High, CacheItemPriorityDecay.Slow, onRemove);
我們來逐個的分析參數的含義:

key 緩沖內容的關鍵字,用來引用緩沖內容的關鍵字。value 要放入緩沖的內容。dependencies 依賴關系,當依賴關系發生改變,內容就會被標為無效的數據。絕對有效期 這里有效期時間為15秒。時間間隔 這里用變量來表示間隔的時間。優先級 這里取 CacheItemPritorty.BelowNormal即優先級為BelowNormal。訪問頻率 這里的頻率是Slow。onRemove 如果采用onRemove ,那么當這個應用程序在緩沖區中的對象被清出緩沖區時,會通報應用程序。
Insert方法也有和Add方法一樣的調用形式,參數的含義也相同,除此之外Insert方法還有簡單的調用形式:
Insert(key, value);
Insert(key, value , CacheDependency);
Insert(key, value, CacheDependency, DateTime, TimeSpan);
其中CacheDependency是指依賴關系,DateTime是有效期的時間,TimeSpan是創建對象的時間間隔。
對數據庫有所了解的程序員來說,緩沖這個概念一定不陌生,為了保證數據庫的安全,數據庫對數據的操作都有緩沖機制。同理,ASP.NET中為了保證數據的安全,也引入了緩沖機制,極大的提高了網站的安全性。
[1]王超,張鵬.ASP.NET/XML深入編程技術.北京:希望電子出版社.2009.
[2]趙克立.ASP.NET編程培訓教程.北京:清華大學出版社. 2005.
[3]楊云,ASP.NET 典型系統開發詳解.北京:人民郵電出版社. 2005.
[4]徐謖,ASP.NET應用與開發教程.北京:清華大學出版社. 2007.