- ASP.NET 教程
- ASP.NET - 首頁
- ASP.NET - 簡介
- ASP.NET - 環境
- ASP.NET - 生命週期
- ASP.NET - 第一個例子
- ASP.NET - 事件處理
- ASP.NET - 伺服器端
- ASP.NET - 伺服器控制元件
- ASP.NET - HTML 伺服器控制元件
- ASP.NET - 客戶端
- ASP.NET - 基本控制元件
- ASP.NET - 指令
- ASP.NET - 狀態管理
- ASP.NET - 驗證器
- ASP.NET - 資料庫訪問
- ASP.NET - ADO.NET
- ASP.NET - 檔案上傳
- ASP.NET - 廣告輪播
- ASP.NET - 日曆控制元件
- ASP.NET - 多檢視
- ASP.NET - 面板控制元件
- ASP.NET - AJAX 控制元件
- ASP.NET - 資料來源
- ASP.NET - 資料繫結
- ASP.NET - 自定義控制元件
- ASP.NET - 個性化
- ASP.NET - 錯誤處理
- ASP.NET - 除錯
- ASP.NET - LINQ
- ASP.NET - 安全性
- ASP.NET - 資料快取
- ASP.NET - Web 服務
- ASP.NET - 多執行緒
- ASP.NET - 配置
- ASP.NET - 部署
- ASP.NET 資源
- ASP.NET - 快速指南
- ASP.NET - 有用資源
- ASP.NET - 討論
ASP.NET - 資料快取
什麼是快取?
快取是一種將常用資料/資訊儲存在記憶體中的技術,這樣,下次需要相同的資料/資訊時,可以直接從記憶體中檢索,而不是由應用程式生成。
快取對於提高 ASP.NET 的效能至關重要,因為頁面和控制元件在此處是動態生成的。對於與資料相關的交易,它尤其重要,因為這些交易在響應時間方面成本很高。
快取將常用資料放置在快速訪問的介質中,例如計算機的隨機存取儲存器。ASP.NET 執行時包含一個名為快取的 CLR 物件的關鍵值對映。它與應用程式一起駐留,並可透過 HttpContext 和 System.Web.UI.Page 獲取。
在某種程度上,快取類似於儲存狀態物件。但是,在狀態物件中儲存資訊是確定性的,即您可以依靠儲存在那裡的資料,而資料的快取是非確定性的。
在以下情況下,資料將不可用
- 如果其生命週期過期,
- 如果應用程式釋放其記憶體,
- 如果由於某種原因沒有進行快取。
您可以使用索引器訪問快取中的專案,並且可以控制快取中物件的生存期,並設定快取物件與其物理源之間的連結。
ASP.NET 中的快取
ASP.NET 提供以下幾種不同型別的快取:
輸出快取:輸出快取儲存最終呈現的 HTML 頁面或傳送到客戶端的頁面部分的副本。當下一個客戶端請求此頁面時,系統會發送頁面的快取副本,而不是重新生成頁面,從而節省時間。
資料快取:資料快取是指快取來自資料來源的資料。只要快取未過期,對資料的請求都將從快取中滿足。當快取過期時,將從資料來源獲取新資料,並重新填充快取。
物件快取:物件快取是在頁面上快取物件,例如資料繫結控制元件。快取的資料儲存在伺服器記憶體中。
類快取:Web 頁面或 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 |
Any Client Downstream Server None |
Any:頁面可以在任何地方快取。 Client:快取的內容保留在瀏覽器中。 Downstream:快取的內容同時儲存在下游和伺服器中。 Server:快取的內容僅儲存在伺服器上。 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.NET 根據文字框中的名稱快取頁面。
資料快取
資料快取的主要方面是快取資料來源控制元件。我們已經討論過,資料來源控制元件表示資料來源中的資料,例如資料庫或 XML 檔案。這些控制元件派生自抽象類 DataSourceControl,並具有以下繼承屬性來實現快取:
CacheDuration - 它設定資料來源快取資料的秒數。
CacheExpirationPolicy - 它定義當快取中的資料過期時的快取行為。
CacheKeyDependency - 它標識控制元件的鍵,當該鍵被移除時,會自動使該控制元件的快取內容過期。
EnableCaching - 它指定是否快取資料。
示例
為了演示資料快取,建立一個新的網站並在其上新增一個新的 Web 窗體。新增一個 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 屬性設定為“true”,並將 Cacheduration 屬性設定為“60”。它將實現快取,並且快取將在每 60 秒後過期。
時間戳在每次重新整理時都會更改,但是如果您在 60 秒內更改表中的資料,則在快取過期之前不會顯示。
<asp:SqlDataSource ID = "SqlDataSource1" runat = "server" ConnectionString = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString %>" ProviderName = "<%$ ConnectionStrings: ASPDotNetStepByStepConnectionString.ProviderName %>" SelectCommand = "SELECT * FROM [DotNetReferences]" EnableCaching = "true" CacheDuration = "60"> </asp:SqlDataSource>
物件快取
物件快取比其他快取技術提供更大的靈活性。您可以使用物件快取將任何物件放入快取中。該物件可以是任何型別 - 資料型別、Web 控制元件、類、資料集物件等。只需分配一個新的鍵名即可將專案新增到快取中,如下所示:
Cache["key"] = item;
ASP.NET 還提供 Insert() 方法用於將物件插入到快取中。此方法有四個過載版本。讓我們來看看它們:
| 過載 | 描述 |
|---|---|
| Cache.Insert((key, value); | 使用鍵名和值將專案插入到快取中,使用預設優先順序和過期時間。 |
| Cache.Insert(key, value, dependencies); | 使用鍵、值、預設優先順序、過期時間和 CacheDependency 名稱將專案插入到快取中,該名稱連結到其他檔案或專案,以便當這些檔案或專案更改時,快取項將不再有效。 |
| 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