快取是一種將經常使用的資料/資訊儲存在記憶體中的技術,這樣,下次需要相同的資料/資訊時,可以直接從記憶體檢索,而不是再從應用程式產生。
快取在用於提高ASP 效能方面是非常重要的,因為ASP 的頁面和控制項是都動態產生的。這對於交互相關的數據是極其重要的,因為響應時間是很寶貴的。
在需要快速存取的媒體,如電腦的隨機存取記憶體,快取放置了被頻繁使用的資料。 ASP 的運行時間包含一個叫做快取的CLR 物件的鍵值對。它位於應用程式內,並且透過HttpContext 和System.Web.UI.Page 可用。
在某些方面,快取和儲存狀態物件有相似之處。然而,狀態物件的儲存資訊是確定的,例如,你可以計算儲存在狀態物件的數據,但是快取的數據是不確定的。
在下列情況裡,數據是不可用的:
如果它的生命週期已結束,
如果該應用程式釋放了它的內存,
如果由於某些原因快取沒有被替換。
您可以使用一個索引器在快取中存取項目,並且有可能控制快取中物件的生命週期和設定快取的物件及其實體資源之間的聯繫。
ASP提供以下幾種不同類型的快取:
輸出快取:輸出快取可以儲存最後顯現的網頁的副本,或是發送到客戶端的部分頁面。下次客戶機要求該頁面時,這個頁面的快取副本就會被傳送給客戶機,而不是重新產生這個頁面,這樣一來就節省了時間。
資料緩存:資料緩存是指從資料來源快取資料。只要快取沒有被替換,那麼再請求該資料時就會從快取中取得。當快取被替換的時候,會從資料來源取得新數據,快取也會再次被填滿。
對象快取:對象快取是快取頁面的對象,例如資料綁定控制項等。快取的資料放在伺服器的記憶體。
類別快取:網頁或Web 服務是第一次執行時在組裝編譯成頁類別。然後組裝會在伺服器快取。當下次請求該頁面或服務,就會使用快取的組裝。當改變原始碼時,CLR 重新編譯程序集。
配置快取:應用程式設定資訊儲存在一個設定檔。配置快取儲存在伺服器記憶體配置資訊。
在本教程中,我們將考慮輸出快取,資料快取和物件快取。
呈現一個頁面可能涉及一些複雜的過程,如,資料庫訪問,呈現複雜的控制等。輸出快取允許透過在記憶體中快取數據,而繞過往返伺服器。甚至可以快取整個頁面。
OutputCache 指令負責輸出快取。它啟用輸出快取,並對其行為提供一定程度的控制。
OutputCache 指令的語法:
<%@ OutputCache Duration="15" VaryByParam="None" %>
把這個指令放在頁面指令下。這告訴環境需要快取頁面,持續15 秒。以下頁面載入事件處理程序將有助於確認頁面是否已快取完畢。
protected void Page_Load(object sender, EventArgs e){ Thread.Sleep(10000); Response.Write("This page was generated and cache at:" + DateTime.Now.ToString());}
Thread.Sleep()方法使特定時間內的程序停止。在這個例子中,線程停止了10 秒鐘,因此,當頁面第一次下載時,需要花費10 秒鐘的時間。然而,下次刷新頁面的時候,就不會花時間了,因為這個頁面已經從快取中獲取了,不要再下載。
當幫助控制輸出快取的行為OutputCache 指令有以下特性:
屬性 | 值 | 描述 |
---|---|---|
DiskCacheable | true/false | 描述輸出是否可以寫入帶有快取的磁碟。 |
NoStore | true/false | 描述"no store" 快取頭部是否被發送。 |
CacheProfile | 字串名 | 儲存在web.config 中的快取設定檔名字。 |
VaryByParam | None*參數名 | GET 請求中使用分號分隔的字串值或是POST 請求中的變數值。 |
VaryByHeader | *頭檔名 | 可能是由客戶端提交的用分號分隔的指定頭的字串。 |
VaryByCustom | 瀏覽器自訂字串 | 通知ASP.NET 透過瀏覽器名字版本或客戶端字串改變輸出快取。 |
Location | 任何客戶端下載流伺服器None | 任何:頁面可能緩存在任何位置客戶端:快取內容包含在瀏覽器中下載流:快取內容保存在下載流和伺服器中伺服器:快取僅保存在伺服器之中None:不允許快取。 |
Duration | 數位 | 被快取頁面或操作的秒數。 |
讓我們為前面的範例新增一個文字方塊和一個按鈕,並加入這個按鈕的事件處理程序。
protected void btnmagic_Click(object sender, EventArgs e){ Response.Write("<br><br>"); Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>") ;}
改變OutputCache 指令:
<%@ OutputCache Duration="60" VaryByParam="txtname" %>
程式執行的時候,ASP 在文字方塊中依據名字快取頁面。
資料快取的主要方面是資料來源控制項快取。我們已經討論了資料來源控制項代表一個資料來源中的資料,如資料庫或XML 檔案。這些控制項從抽象類別DataSourceControl 衍生,並有以下繼承屬性以實現快取:
快取期— 為快取資料的資料來源計時。
快取期滿策略— 定義了當資料在快取中過期時,快取的行為。
快取值依賴— 定義了一個控制項值,這個控制項可以在資料期滿時自動移出快取。
啟用快取— 可以確認是否快取了資料。
為了演示資料快取,我們創建一個新的網站,在上面添加一個新的網頁表單。在資料庫中新增一個連接資料存取教學課程的SqlDataSource 控制項。
在這個實例中,我們為頁面新增一個標籤,這個標籤可以顯示頁面的回應時間。
<asp:Label ID="lbltime" runat="server"></asp:Label>
除了這個標籤,整個頁面和資料存取教學是一樣的。為這個頁面新增一個事件處理器,來下載時間。
protected void Page_Load(object sender, EventArgs e){ lbltime.Text = String.Format("Page posted at: {0}", DateTime.Now.ToLongTimeString());}
設計的頁面應該是如下這個樣子的:
當你第一次執行頁面時,並沒有發生什麼不同。標籤顯示,每次刷新頁面,頁面會重新載入,而且在標籤上會顯示時間的變化。
接下來,把資料來源控制項的EnableCaching 的屬性設定為「真」,將Cacheduration 屬性設定為「60」。它將實現快取,快取將每隔60 秒到期。
每一次刷新,時間戳都會改變。但如果你在60 秒之內改變表中的資料,在快取到期之前將不會顯示。
<asp:SqlDataSource ID = "SqlDataSource1" runat = "server" ConnectionString = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>" ProviderName = "<%$ ConnectionStrings: ASPDot 您EnableCaching = "true" CacheDuration = "60"> </asp:SqlDataSource>
物件快取比其他快取技術提供了更大的靈活性。你可以利用物件緩存在快取中放置任何物件。物件也可以是任意類型的— 資料類型,網路控件,類,資料設定物件等等。僅僅需要給這些項目分配一個值名,它們就可以被加入到快取中,就像下面展示的一樣:
Cache["key"] = item;
為了在快取中插入對象, ASP 提供了Insert() 方法。這種方法有四種重載版本。我們來看一下:
重載 | 描述 |
---|---|
Cache.Insert((key, value); | 以鍵值對的方式插入緩存,優先權和生命週期為預設。 |
Cache.Insert(key, value, dependencies); | 以鍵值對的方式插入緩存,優先權和生命週期為默認,和連結到其他文件或內容的緩存依賴,這樣緩存修改就不再還有限的了。 |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration); | 指出上述配置的有效期限。 |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback); | 與配置一起也允許設定快取內容的優先權並委派,指出一種方法來呼叫當一個物件移除時。 |
動態生命週期使用於移除一個不作用於任何一個指定的時間跨度的快取項目。下面程式碼段用來保存一個具有10 分鐘滑動生命週期的無依賴的快取項目:
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
僅使用一個按鈕和一個標籤來建立一個頁面。在頁面載入事件中寫入如下程式碼:
protected void Page_Load(object sender, EventArgs e){ if (this.IsPostBack) { lblinfo.Text += "Page Posted Back.<br/>"; } else { lblinfo.Text += "page Created.<br/> "; } if (Cache["testitem"] == null) { lblinfo.Text += "Creating test item.<br/>"; DateTime testItem = DateTime.Now; lblinfo.Text += "Storing test item in cache "; lblinfo.Text += "for 30 seconds.<br/>"; Cache.Insert("testitem ", testItem, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero); } else { lblinfo.Text += "Retrieving test item.<br/>"; DateTime testItem = (DateTime)Cache["testitem"]; lblinfo.Text += "Test item is: " + testItem.ToString(); lblinfo.Text += "<br/>"; } lblinfo.Text += "<br/>";}
當頁面第一次載入時,會顯示:
Page Created.Creating test item.Storing test item in cache for 30 seconds.
如果你在30 秒內再次點擊按鈕,雖然頁面被刪除了,但是標籤控制項會從快取中得到信息,如下所示:
Page Posted Back.Retrieving test item.Test item is: 14-07-2010 01:25:04