ASP.NET 2.0 提供多層次快取架構:從整頁輸出快取、區塊快取、資料源快取,到分散式快取與 SQL 相依性快取。本文系統整理各層快取技術、設定參數、進階應用與程式化控制 API。
快取完整頁面輸出至記憶體,後續請求直接回應,跳過頁面生命週期。
Location="Any|Client|Downstream|Server|None|ServerAndClient",預設 Any。VaryByCustom + Global.asax GetVaryByCustomString() 實作角色/語言/裝置差異快取。Response.AddFileDependency(path),檔案變更自動失效快取。HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/path.aspx"))。Cache.Insert("Key", DateTime.Now); Response.AddCacheItemDependency("Key"); 另一頁面 Cache.Remove("Key") 觸發連動失效。針對 用戶控件 獨立設定 @OutputCache,不同區塊套用不同策略。父頁面不快取,子控件快取。
Shared="true":同一用戶控件在多頁面間共享快取實例。VaryByControl:依控件屬性值變化快取(如下拉選單選擇)。<asp:SqlDataSource EnableCaching="true" CacheDuration="60"
CacheExpirationPolicy="Sliding|Absolute"
SqlCacheDependency="Northwind:Products" />
CacheDuration:秒數。CacheExpirationPolicy:Sliding (滑動) / Absolute (絕對)。SqlCacheDependency:資料表異動自動失效(輪詢或 SQL 2005 查詢通知)。Cache["Key"] = value; / Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback)。
CacheDependency (檔案/鍵/聚合)、SqlCacheDependency。CacheItemRemovedCallback 實作快取失效後續處理(重新載入、日誌、通知)。| 原則 | 說明 |
|---|---|
| 快取「昂貴」資料 | 複雜查詢、外部 API 呼叫、大量運算結果 |
| 設定合理逾時 | 平衡資料新鮮度與效能增益 |
| 使用相依性而非固定逾時 | 資料變更即時失效,避免髒讀 |
| 監控快取命中率 | Performance Counter: ASP.NET Applications \ Cache Hit Ratio |
| 避免快取大型物件圖 | 序列化/反序列化開銷、記憶體碎片 |
ASP.NET 2.0 的快取架構靈活強大,關鍵在於根據資料特性選擇正確層級與策略,並善用相依性機制確保資料一致性。