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());
}

設計的頁面應如下所示

Data Caching

當您第一次執行頁面時,不會發生任何不同的事情,標籤顯示每次重新整理頁面時,頁面都會重新載入,並且標籤上顯示的時間也會發生變化。

接下來,將資料來源控制元件的 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
廣告
© . All rights reserved.