首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 快取機制全面解析:頁面、部分頁面、資料源、物件與 SQL 相依性

     編輯:ASP.NET 基礎

快取是提升 ASP.NET 應用程式效能的關鍵技術。本文系統整理五大快取層面:頁面輸出快取、部分頁面快取、資料源快取、Cache 物件快取與 SQL 快取相依性,並提供關鍵屬性、程式碼範例與最佳實務。

1. 頁面輸出快取

在 .aspx 頁面加入 @ OutputCache 指令即可快取整頁輸出。

<%@ OutputCache Duration="60" VaryByParam="*" Location="Server" %>

核心屬性

屬性說明
Duration快取秒數(必填)
VaryByParam依查詢字串/表單參數變化快取(必填,none 或 * 或參數名)
VaryByControl用戶控件:依控制項 ID 變化快取
VaryByCustom自訂變化邏輯(如 browser 或覆寫 GetVaryByCustomString)
VaryByHeader依 HTTP 標頭變化快取
Location快取位置:Any/Client/Server/None/Downstream/ServerAndClient
NoStore防止敏感資料被 Proxy 快取
CacheProfile引用 web.config 中定義的快取設定檔
SqlDependency依資料庫資料變更使快取失效
Shared用戶控件輸出是否跨頁共享

程式化操作頁面快取

// 建立檔案相依性
Response.AddFileDependency(Server.MapPath("test.xml"));

// 移除特定頁面快取
HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/test.aspx"));

// 使用鍵值相依性讓多頁同時失效
// 頁面載入時建立相依性
Cache.Insert("PageKey", DateTime.Now);
Response.AddCacheItemDependency("PageKey");
// 需要失效時
Cache.Remove("PageKey");

2. 部分頁面快取

用戶控件快取

在 .ascx 加入 @ OutputCache,可設定 Shared="true" 跨頁共享。

快取後替換

  • 宣告式:<asp:Substitution runat="server" MethodName="GetFreshContent" />,方法必須為 static。
  • 程式式:Response.WriteSubstitution(callback),回呼可為實例或靜態方法,適合自訂控件。

動態載入快取用戶控件

PartialCachingControl ctrl = (PartialCachingControl)Page.LoadControl("CachedControl.ascx");
ctrl.CachePolicy.SetExpires(DateTime.Now.AddSeconds(30));
PlaceHolder1.Controls.Add(ctrl);

3. 資料源控件快取

SqlDataSource、ObjectDataSource、XmlDataSource 內建快取支援。

<asp:SqlDataSource ...
    EnableCaching="true"
    CacheDuration="60"
    CacheExpirationPolicy="Absolute" /> 
    <!-- Sliding 為滑動過期 -->
  • 相同 SelectCommand、SelectParameters、ConnectionString 視為相同快取鍵,自動共享。
  • XmlDataSource 可設 DataFile 建立檔案相依性。

資料源鍵值相依性

  1. 設定 CacheKeyDependency="MyKey"。
  2. Global.asax Application_Start 初始化:Cache.Insert("MyKey", DateTime.Now, null, DateTime.MaxValue, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null);
  3. 資料異動頁面移除鍵:Cache.Remove("MyKey"); 或 Cache.Insert("MyKey", DateTime.Now); 觸發所有相依資料源重新載入。

4. Cache 物件快取

可快取任意物件:DataSet、DataTable、自訂類別、集合等。

基本模式

DataTable dt = Cache["dtKey"] as DataTable;
if (dt == null)
{
    dt = GetDataFromDB();
    Cache.Insert("dtKey", dt, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration);
}
GridView1.DataSource = dt;
GridView1.DataBind();

三種相依性類型

  • CacheDependency:檔案或快取鍵相依。
  • SqlCacheDependency:SQL Server 資料表/查詢相依(輪詢或查詢通知)。
  • AggregateCacheDependency:組合多個相依性。

優先級與移除回呼

Cache.Insert("key", value, dependency, 
    DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration,
    CacheItemPriority.High, OnItemRemoved);

void OnItemRemoved(string key, object value, CacheItemRemovedReason reason) { ... }

5. SQL 快取相依性

ASP.NET 支援兩種模式:

拉模式 - 表輪詢

  • 適用:SQL Server 7.0/2000/2005/2008/2012/2014/2016/2019/2022、Express 版本。
  • 原理:觸發器更新通知資料表,ASP.NET 背景執行緒定期輪詢(pollTime)。
  • 設定步驟:
    1. aspnet_regsql -C "connStr" -ed -t TableName 啟用資料庫與資料表通知。
    2. web.config 設定 <sqlCacheDependency enabled="true" pollTime="1000">。
    3. 頁面/資料源/Cache 使用 SqlDependency="DB:Table" 或 new SqlCacheDependency("DB", "Table")。

推模式 - 查詢通知

  • 僅限 SQL Server 2005+ (需 Service Broker)。
  • 優點:無輪詢延遲,即時通知。
  • 限制:查詢必須符合嚴格規則(兩部分名稱、明確欄位、無 *、無 View、無 Outer Join、無子查詢、無 DISTINCT/聚合等)。
  • 啟用:ALTER DATABASE MyDB SET ENABLE_BROKER;授權 GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [User]。
  • 程式碼:SqlDependency.Start(connStr); 在 Application_Start;使用 new SqlCacheDependency(command) 或設定 SqlCacheDependency="CommandNotification"。

最佳實務建議

  • 優先使用 資料源控件快取 簡化資料繫結場景。
  • 複雜商業邏輯物件使用 Cache 物件 搭配適當相依性。
  • 避免快取大型物件圖導致記憶體壓力;考慮序列化存儲至分散式快取。
  • SQL 相依性在高寫入資料表慎用,輪詢頻率與資料一致性需取捨。
  • 監控快取命中率、記憶體使用,定期調整策略。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved