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

ASP.NET 三大快取策略全解析:頁面輸出、片段與資料快取 API

     編輯:關於ASP.NET

快取:效能提升的銀彈

在 ASP.NET 提供的眾多特性中,快取對應用程式效能的潛在影響最大。記住 Steve 的快取金律:「盡早快取;經常快取」。在資料層、商務邏輯層、UI 層全面佈局快取,利用廉價記憶體換取極大的效能增益。快取也是典型的「二八法則」:20% 的努力 (設定快取) 帶來 80% 的效能提升,是效能調優的首選利器。

三大快取形式比較

快取類型適用層級優點缺點典型場景
頁面級輸出快取表現層最簡單、效能最佳、無需程式碼粒度粗、無法區塊化、個人化困難靜態內容頁、產品目錄、報表輸出
片段快取 (用戶控制項)表現層可快取頁面區塊、支援個人化參數需拆解用戶控制項、共享快取需設定導航選單、側邊欄推薦、頁首頁尾
資料快取 API (Cache 物件)全層級彈性最高、支援相依性/回呼/過期策略需手動管理、程式碼較多資料層查詢結果、商務物件、計算結果

1. 頁面級輸出快取

基本語法

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

五大屬性詳解

  • Duration (必要):快取秒數,正整數。
  • VaryByParam (必要):依查詢字串/表單參數建立不同快取版本。"none" 共用單一版本;"*" 參數組合各自快取;"categoryID;page" 指定參數。
  • Location:Any (預設) / Client / Downstream / Server / None / ServerAndClient。
  • VaryByHeader:依 HTTP 標頭 (如 User-Agent、Accept-Language) 區分版本。
  • VaryByCustom:自訂邏輯,需在 Global.asax 覆寫 GetVaryByCustomString。常用 "Browser" 依瀏覽器類型區分。

進階範例:依瀏覽器輸出不同版本

<%@ OutputCache Duration="60" VaryByParam="none" VaryByCustom="Browser" %>
' Global.asax
Public Overrides Function GetVaryByCustomString(context As HttpContext, custom As String) As String
    If custom.Equals("Browser", StringComparison.OrdinalIgnoreCase) Then
        Return context.Request.Browser.Type ' 如 "IE11", "Chrome90"
    End If
    Return MyBase.GetVaryByCustomString(context, custom)
End Function

2. 片段快取 (用戶控制項)

用戶控制項 .ascx 設定

<%@ Control Language="vb" %>
<%@ OutputCache Duration="120" VaryByParam="CategoryID" Shared="true" %>
<!-- 控制項標記 -->
  • Shared="true":同一頁面多個實例共用同一快取副本 (依 VaryByParam 區分),預設 false。
  • 母頁面不可設定 OutputCache,否則子控制項快取失效。

3. 資料快取 API (System.Web.Caching.Cache)

核心方法

' 插入/更新 (含相依性、過期、優先權、回呼)
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback)

' 取得
Dim obj As Object = Cache(key)

' 移除
Cache.Remove(key)

實戰範例:資料層快取產品清單

Public Function GetProducts() As List(Of Product)
    Const cacheKey As String = "ProductList_All"
    Dim products As List(Of Product) = CType(Cache(cacheKey), List(Of Product))
    
    If products Is Nothing Then
        ' 模擬資料庫查詢
        products = DataAccessLayer.FetchAllProducts()
        
        ' 建立 SqlCacheDependency (需啟用資料庫通知)
        Dim dep As New SqlCacheDependency("Northwind", "Products")
        
        ' 插入快取:1 小時絕對過期、高優先權、移除回呼記錄日誌
        Cache.Insert(cacheKey, products, dep, 
                     DateTime.Now.AddHours(1), 
                     Cache.NoSlidingExpiration, 
                     CacheItemPriority.High,
                     AddressOf OnProductCacheRemoved)
    End If
    Return products
End Function

Private Sub OnProductCacheRemoved(key As String, value As Object, reason As CacheItemRemovedReason)
    ' 記錄日誌、觸發預熱等
    Trace.Write("Cache", $"Product cache removed: {reason}")
End Sub

快取策略決策樹

  1. 內容是否因使用者而異?
    → 是:片段快取 (VaryByParam/Control) 或資料快取 (Key 包含 UserID)。
    → 否:優先考慮頁面輸出快取。
  2. 資料更新頻率?
    → 低 (小時/天):長 Duration + SqlCacheDependency。
    → 高 (分鐘):短 Duration 或滑動過期。
  3. 是否需跨頁面共用資料?
    → 是:資料快取 API (Cache 物件)。
    → 否:輸出快取或片段快取即可。

常見陷阱與避坑指南

  • 快取過大物件:記憶體壓力導致頻繁 GC 或回收,設定 CacheItemPriority 並監控記憶體使用量。
  • 遺漏相依性:資料異動未失效快取,導致髒讀。務必搭配 SqlCacheDependency、檔案相依性或自訂相依性。
  • VaryByParam="*" 濫用:參數組合爆炸產生大量快取版本,佔滿記憶體。明確列出必要參數。
  • 開發環境未關閉快取:導致修改不生效。開發時設 Duration="0" 或 <caching enabled="false" />。

結語

ASP.NET 三大快取機制各有甜點,實務上常組合使用:頁面輸出快取處理靜態頁面、片段快取處理可重用區塊、資料快取 API 處理跨層共用資料與複雜相依邏輯。掌握其特性與參數細節,並建立快取監控與預熱機制,即能讓系統在高併發下依然從容應對。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved