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

ASP.NET 快取機制全方位深度指南:資料、頁面、控件、依賴、回調與組態

     編輯:ASP.NET 基礎

快取核心價值

以空間換時間:將昂貴計算結果(資料庫查詢、複雜運算、外部 API 呼叫)存入記憶體,設定過期策略,後續請求直接讀取,大幅降低延遲與資料庫壓力。典型場景:首頁熱門商品、分類導航、權限矩陣、報表資料。

三大快取類型對比

類型範圍宣告方式適用場景
資料快取應用程式域 (AppDomain)Cache["key"] = obj / Cache.Insert共用商業邏輯資料、查詢結果、計算結果
頁面輸出快取單一 .aspx 頁面輸出 HTML<%@ OutputCache %> 指示詞靜態化程度高、個人化低的頁面(首頁、列表頁)
控件快取UserControl (.ascx) 輸出<%@ OutputCache %> 或 VaryByControl頁面局部片段(側邊欄、推薦區塊)

資料快取完整 API 操作

基本讀寫


// 寫入(無過期,永久駐留直到記憶體壓力移除)
Cache["LastUpdate"] = DateTime.Now;

// 讀取
if (Cache["LastUpdate"] != null)
    Response.Write((DateTime)Cache["LastUpdate"]);

進階 Insert 參數詳解


Cache.Insert(
    key: "ProductList",
    value: productList,
    dependencies: new CacheDependency(Server.MapPath("~/App_Data/products.xml")), // 檔案變更自動失效
    absoluteExpiration: DateTime.Now.AddMinutes(30), // 絕對過期:30 分鐘後必失效
    slidingExpiration: Cache.NoSlidingExpiration,    // 滑動過期:不使用
    priority: CacheItemPriority.Normal,              // 記憶體壓力下淘汰優先序
    onRemoveCallback: CacheItemRemovedCallback       // 移除回調
);
  • absoluteExpiration vs slidingExpiration:二擇一。Sliding:每次存取重設倒數計時,適合熱門資料;Absolute:固定時間點失效,適合定時更新資料。
  • CacheDependency:檔案、目錄、其他 Cache Key 變更觸發失效,實現「資料來源變更即時更新」。
  • CacheItemPriority:Low、Normal、High、NotRemovable,記憶體不足時優先淘汰低優先序。

移除回調實作


public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)
{
    // reason: Expired, Removed, Underused, DependencyChanged
    File.AppendAllText(Server.MapPath("~/App_Data/cache.log"),
        $"{DateTime.Now}: Key={key}, Reason={reason}{Environment.NewLine}");
}

頁面輸出快取指示詞完整屬性


<%@ OutputCache
    Duration="60"                   <!-- 快取秒數 -->
    VaryByParam="categoryId;page"   <!-- 依查詢字串參數區分快取版本 -->
    VaryByControl="ddlCategory"     <!-- 依控制項值區分(控件快取) -->
    VaryByCustom="browser"          <!-- 依自訂字串(需 Global.asax GetVaryByCustomString) -->
    Location="Server"               <!-- Server/Client/Downstream/None -->
    NoStore="false"                 <!-- true=不快取任何位置 -->
    SqlDependency="CommandNotification" <!-- SQL 快取相依性 -->
%>

控件快取兩種模式

UserControl 內嵌指示詞


<%@ OutputCache Duration="120" VaryByParam="none" Shared="true" %>
<!-- Shared=true:多頁面共用同一 UserControl 快取 -->

頁面層級 VaryByControl


<%@ OutputCache Duration="30" VaryByControl="ddlRegion" %>
<asp:DropDownList ID="ddlRegion" runat="server" AutoPostBack="true" />

不同下拉選單值產生不同快取版本。

Web.config 集中管理快取設定檔


<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="HomePageCache" duration="300" varyByParam="none" location="Server" />
        <add name="ProductListCache" duration="60" varyByParam="categoryId" />
      </outputCacheProfiles>
    </outputCacheSettings>
    <sqlCacheDependency enabled="true" pollTime="5000">
      <databases>
        <add name="AppDb" connectionStringName="AppDb" />
      </databases>
    </sqlCacheDependency>
  </caching>
</system.web>

頁面套用:<%@ OutputCache CacheProfile="HomePageCache" %>

IIS 核心模式快取組態 (system.webServer/caching)


<system.webServer>
  <caching enabled="true" enableKernelCache="true">
    <profiles>
      <add extension=".aspx" policy="CacheForTimePeriod" duration="00:00:10" varyByQueryString="*" kernelCachePolicy="CacheUntilChange" />
      <add extension=".jpg" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" />
      <add extension=".css" policy="CacheUntilChange" />
      <add extension=".js" policy="CacheUntilChange" />
    </profiles>
  </caching>
</system.webServer>
  • kernelCachePolicy:HTTP.sys 核心快取,效能最高,繞過 Managed Pipeline。
  • 關閉特定頁面/目錄快取:<location path="Admin"> ... policy="DontCache" </location>

快取設計最佳實踐原則

  1. 快取關鍵路徑:優先快取高頻、高成本、低變動資料。
  2. 快取鍵命名規範:Area:Entity:Action:ParamHash,避免衝突、易於清除。
  3. 雙重檢查鎖定模式:多執行緒環境下防止重複建立昂貴物件。
    
    if (Cache[key] == null)
    {
        lock (syncObj)
        {
            if (Cache[key] == null)
                Cache.Insert(key, BuildExpensiveObject(), ...);
        }
    }
    
  4. 快取預熱:應用程式啟動或排程任務主動建立熱門快取,避免首次請求延遲。
  5. 監控指標:命中率、淘汰率、記憶體佔用、回調頻率。PerformanceCounter 類別 .NET CLR Memory / Cache。
  6. 分散式快取遷移:單機 Cache 受限於 AppDomain、記憶體上限、單點故障。擴展至 Redis、NCache、SQL Server 分散式快取 時,介面抽象 ICacheProvider 平滑切換。

常見反模式與避坑

反模式後果修正
快取巨大物件圖 ( > 1MB )LOH 碎片化、GC 壓力大拆分細粒度、序列化壓縮、外部儲存
無過期策略永久駐留記憶體洩漏、資料過期強制 AbsoluteExpiration、依賴檔案/SQL
快取 DbContext / Entity 實體追蹤衝突、連線洩漏、序列化失敗快取 DTO/POCO、AsNoTracking 查詢
依賴 Session 狀態做快取擴展性差、Web Farm 同步問題改用分散式快取
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved