asp.net頁面緩衝cache分析

來源:互聯網
上載者:User

緩衝方式
ASP.NET中的緩衝大體上分為兩種方式:應用程式緩衝和網頁輸出快取。前者用編程的方式來快取資料,這是本文主要說明的東西;後者是通過配置每個頁面或是Web.config檔案來實現的。而網頁輸出快取有兩種方式,一是緩衝整個頁面,一是緩衝部分頁面……這部分的內容以後再說。

 
自動移除
ASP.NET從緩衝中自動移除資料的原因是以下之一:

伺服器記憶體過低;
快取項目到期;
快取項目依賴改變。
 
應用程式緩衝依賴
緩衝依賴可以有以下幾種方式:鍵和值依賴;檔案依賴,快取項目依賴於一個外部檔案,比如XML檔案,如果這個檔案被修改或刪除,則快取項目將被移除;SQL依賴,快取項目依賴於Microsoft SQL Server 2005、SQL Server 2000、或是SQL Server 7.0資料庫教程的一個表,對於SQL Server 2005,快取項目可以依賴表中的一條記錄;彙總(Aggregate)依賴,快取項目同時依賴於前邊的幾種情況,比如一個快取項目同時依賴於另一個快取項目和外部檔案,如果其中一個改變,則快取項目將被移除;自訂依賴。

如何向緩衝中添加快取項目
你可以在應用程式中使用Cache對象訪問快取項目。使用Cache對象的Insert方法將一個快取項目添加到應用程式緩衝中,該方法有很多重載方法,讓你用不同的緩衝策略將一個快取項目添加到緩衝中。

如果你用Insert方法向緩衝中添加快取項目,並且緩衝中存在同名快取項目,那麼,緩衝中的同名快取項目將被替換(覆蓋)。

你也可以使用Add方法將快取項目添加到緩衝中,添加的方法同Insert一樣。Add方法會返回你添加到緩衝中的對象。另外,如果使用Add方法添加快取項目,並且緩衝中存在同名快取項目,那麼這個同名快取項目將不會被替換,也不會產生異常。

本文說明根據不同的緩衝策略將快取項目添加到應用程式緩衝的方法:

通過設定鍵和值,直接將一個快取項目添加到應用程式緩衝。
通過Insert方法將快取項目添加到應用程式緩衝。
添加一個帶緩衝依賴的快取項目到應用程式緩衝。當緩衝依賴發生變化時,這個快取項目將被從緩衝中移除。你可以設定基於其他快取項目、檔案或是多個對象的緩衝依賴。
添加一個帶到期策略的快取項目到應用程式緩衝。除了可以設定緩衝依賴外,你也可以設定快取項目在一段時間後到期(滑動到期時間)或是在一個規定的時間到期(絕對到期時間),不能同時規定這兩個到期時間。
添加一個帶緩衝優先順序的快取項目到應用程式緩衝。緩衝優先順序可以協助.NET架構決定哪個快取項目先被移除。
通過Add方法添加一個快取項目到應用程式緩衝。
除了以上的緩衝依賴外,你可以在資料庫的表上建立緩衝依賴,或是自訂緩衝依賴。通過CacheItemRemovedCallback委託,當從緩衝中移除快取項目時,會提示應用程式。

以下是將快取項目添加到應用程式的具體方法:

1) 通過設定鍵和值,直接將一個快取項目添加到應用程式緩衝。下面的代碼示範鍵為“CacheItem1”,值為“Cached Item 1”的快取項目添加到緩衝中:

Cache["CacheItem1"] = "Cached Item 1";
2) 通過Insert方法將快取項目添加到應用程式緩衝。下面的代碼示範用Insert方法,將鍵為“CacheItem2”,值為“Cached Item 2”的快取項目添加到緩衝中:

Cache.Insert("CacheItem2", "Cached Item 2");
3) 添加一個帶緩衝依賴的快取項目到應用程式緩衝,這個緩衝依賴可以是其他快取項目,檔案,或是與多個對象依賴。當緩衝依賴發生變化時,這個快取項目將被從緩衝中移除。下面三個例子示範調用Insert方法,並把CacheDependency對象的執行個體傳給該方法,向緩衝添加快取項目。

下面的代碼示範用Insert方法,將鍵為“CacheItem3”的快取項目添加到緩衝中,該快取項目依賴於名為“CacheItem2”的快取項目:

string[] dependencies = { "CacheItem2" };Cache.Insert("CacheItem3", "Cached Item 3",                   new System.Web.Caching.CacheDependency(null, dependencies));
下面的代碼示範調用Insert方法,將鍵為“CacheItem4”的快取項目添加到緩衝中,該快取項目依賴於檔案XMLFile.xml:

Cache.Insert("CacheItem4", "Cached Item 4",new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml")));
下面的例子示範如何用Insert方法建立多緩衝依賴,一個快取項目同時依賴於鍵為“CacheItem1”的快取項目和檔案XMLFile.xml。這裡使用了彙總緩衝依賴的類AggregateCacheDependency類。

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);
4) 添加一個帶到期策略的快取項目到應用程式緩衝。除了可以設定緩衝依賴外,你也可以設定快取項目在一段時間後到期(滑動到期時間)或是在一個規定的時間到期(絕對到期時間),不能同時規定這兩個到期時間。

下面代碼示範了時間為1分鐘的絕對到期時間:

Cache.Insert("CacheItem6", "Cached Item 6",                   null, DateTime.Now.AddMinutes(1d),                    System.Web.Caching.Cache.NoSlidingExpiration);
下面代碼示範了時間為10分鐘的滑動到期時間:

Cache.Insert("CacheItem7", "Cached Item 7",                   null, System.Web.Caching.Cache.NoAbsoluteExpiration,                   new TimeSpan(0, 10, 0));
5) 添加一個帶緩衝優先順序的快取項目到應用程式緩衝。緩衝優先順序可以協助.NET架構決定哪個快取項目先被移除。代碼如下:

Cache.Insert("CacheItem8", "Cached Item 8",                   null, System.Web.Caching.Cache.NoAbsoluteExpiration,                   System.Web.Caching.Cache.NoSlidingExpiration,                   System.Web.Caching.CacheItemPriority.High, null);
6) 通過Add方法添加一個快取項目到應用程式緩衝。代碼如下:

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);
如何從緩衝中檢索快取項目
規定快取項目的索引值就可以從緩衝中檢索快取項目的資料。然而,因為儲存在緩衝中的資料是不穩定的,可能會被ASP.NET移除,所以,推薦的開發方式為應該先確定快取項目是否存在,如果不存在,應該先添加該快取項目到緩衝,然後再檢索該快取項目。

下面的例子示範,確定名為“CacheItem”的快取項目是否存在,如果存在,則把快取項目的值賦給變數cachedString;否則,把快取項目添加到緩衝中,再把該快取項目的值賦給變數cachedString。代碼如下:

string cachedString;if (Cache["CacheItem"] != null){    cachedString = (string)Cache["CacheItem"];}else{    Cache.Insert("CacheItem", "Hello, World.");    cachedString = (string)Cache["CacheItem"];}
如何移除ASP.NET緩衝中的緩衝
ASP.NET緩衝中的資料是不穩定的,不會被永久地儲存,可能會由於以下原因之一而從緩衝中被自動移除:

緩衝滿了
快取項目已經到期
緩衝依賴的項改變了
除了可以自動移除快取項目外,你可以顯示移除快取項目。另外,當你用Insert方法和Add方法向緩衝中添加的快取項目已經存在時,那麼,原來的快取項目將被自動刪除。

顯示移除快取項目

調用Remove方法,將你想要移除的快取項目的索引值傳給它。下面的代碼示範,移除索引值為“MyData1”的快取項目:

Cache.Remove("MyData1");
如何通知應用程式快取項目已被移除
在大多數的緩衝情況下,當一個快取項目被移除後,你並不需要立刻把該快取項目重新放回到緩衝中,除非你再次使用它。典型的做法是,從使用該快取項目開始,就一直檢查它。如果該快取項目在緩衝中,那麼就使用它;否則,重建要緩衝的內容並把它添加到緩衝中再使用。

然而,在有些情況下,通知應用程式,快取項目被移除是非常有用的。比如,你緩衝了一個需要一定時間才能產生的報告,當從緩衝中移除該報告後(這個報告估計到期了),你想重建,並且把它立即放到緩衝中,以便下次請求使用,這樣,使用者就不需要再等待。關鍵在於,產生這個報告是需要時間的,如果能事先將該報告緩衝起來,當使用者需要的時候,就可以直接從緩衝中獲得。

為了使應用程式注意到快取項目已經被移除,ASP.NET提供了CacheItemRemovedCallback委託。委託定義了一個事件的聲明,用來對快取項目從緩衝中移除做出響應。另外,ASP.NET還提供CacheItemRemovedReason枚舉,用來規定快取項目被移除的原因。

例子
下面的例子示範了當快取項目被移除後,ReportManager類如何處理資訊,該類管理一個字串形式的報告。

儘管該類使用了static修飾符,但並不是必須的。然而,處理回調的方法必須不過,刪除快取項目時,用於處理回調的方法必須存在。例如,不應在ASP.NET 頁中實現回調處理常式,因為在從緩衝中刪除項之前該頁可能已被釋放,因此用於處理回調的方法將不可用。為了確保從緩衝中刪除項時處理回調的方法仍然存在,請使用該方法的靜態類。但是,靜態類的缺點是需要保證所有靜態方法都是安全執行緒的。

注意
Do not set the CacheItemRemovedCallback to a method in a page. In addition to a page method not being available for a callback after the page is disposed of, pointing the callback to a page method can prevent the memory used by the page from being reclaimed by garbage collection. This happens because the callback contains a reference to the page and the garbage collector will not remove an item from memory if the item has any references. During periods of application load, this could cause memory to be used up very quickly.(有興趣的話可以看一下這段話)

ReportManager 類的代碼


1) 私人成員變數 "_reportRemovedFromCache" 用於判斷報告是否被移除;

2) GetReport 方法從緩衝中獲得報告。如果該報告已經存在,則獲得;否則,建立並添加報告到緩衝中;

3) CacheReport 方法用於建立並添加報告到緩衝中。

在這個共有的成員函數中,使用了六個參數的 Add 方法,其中,第一個和第二個參數分別是快取項目的鍵和值;第三個參數是緩衝依賴,本例子沒有緩衝依賴,所以為 null;第四和第五個參數是關於到期時間的;第六個參數是緩衝優先順序;第七個參數是 CacheItemRemovedCallback 委託,只要與 CacheItemRemovedCallback 具有相同簽名的函數都可以,本例使用了成員函數 ReportRemovedCallback。

4) CreateReport 方法用於建立報告,一個字串而已;

5) ReportRemovedCallback 方法用於報告回調。也就是,重建報告,並將報告添加到緩衝中。

快取項目被移除後提醒應用程式
1) 建立一個類,負責從緩衝中檢索快取項目,並處理callback方法以便將快取項目重新添加到緩衝中。

2) 在這個類中,建立一個方法用來將快取項目添加到緩衝中。

3) 在這個類中,建立一個方法,用來從緩衝中獲得該快取項目。

4) 建立一個方法,用來處理快取項目移除的回調。這個方法必須具有同 CacheItemRemovedCallback 委託的簽名相同。

在這個方法中,當快取項目從緩衝中移除後,比如,重建快取項目,並把它重新添加到緩衝,完成你需要的邏輯。

測試快取項目的回調
1) 建立一個ASP.NET Web頁面,調用類中的方法,將快取項目添加到緩衝中。

下面的代碼示範,在Page_Load事件裡,調用ReportManager類中的GetReport方法,返回報告的內容,顯示在Lable控制項:

protected void Page_Load(object sender, EventArgs e){    this.Label1.Text = ReportManager.GetReport();}
2) 在瀏覽器中請求ASP.NET頁面,查看報告。這個報告在第一次請求頁面時會被建立,接下來的請求將會從緩衝中訪問這個報告,知道這個報告被移除。

 

總結
在ASP.NET下使用緩衝技術,我個人覺得有以下幾點:

1) 提高應用程式效能的手段在應用程式開發的各個階段都能體現出來,既有小細節,又有大方向。比如,保證設計一個好的軟體邏輯結構;保證使用一個合適的資料結構,是集合、樹形結構,還是鏈表。凡是程式都是由資料結構組成的,一談到資料結構就一定會涉及到資料的插入、刪除、修改和檢索、排序這幾個基本操作,不同的資料結構對各種操作的效能有很大的差異。上學時,在《資料結構》的書裡講得很清楚,只是當時沒什麼實踐,體會不到罷了;另外,對於類中成員函數的形式參數,是使用值傳遞,還是引用傳遞。值傳遞時,在被調函數中會建立該參數的副本,這肯定會消耗系統記憶體,而引用傳遞只是傳遞一個該資料結構的地址而已……總之,這要求你在實踐中慢慢地積累

2) 而使用應用程式緩衝是提高應用程式效能的一個非常重要的手段。既可以節省系統資源,有可以提高對使用者的相應時間。所以說,緩衝技術很有意義。

3) 在前面的幾篇裡,你也許已經發現了,緩衝無非涉及了四個操作,添加、檢索(讀取)、刪除(移除)和回調。“添加”快取項目後,需要時就“檢索(讀取)”它,不需要或快取項目到期了就“刪除(移除)”它,而“回調”是將以上幾個操作同應用程式的事件結合起來。很合乎情理。其實,就緩衝本身而已,它的操作很簡單,一條語句,頂多兩條語句就完成了。因此,真正的問題不是前面所說的“添加”、“檢索”、“刪除”和“回調”如何操作,而是在什麼情況下使用緩衝,緩衝什麼東西,如何在軟體邏輯結構中實現緩衝技術,這才是關鍵問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.