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

.NET 4.0 可擴展快取架構:System.Runtime.Caching 與 ChangeMonitor 實戰

     編輯:關於.NET

Enterprise Library 的遺產:System.Runtime.Caching

微軟 Patterns & Practices 團隊產出的 Enterprise Library 組件最終納入 .NET Framework 核心,System.Runtime.Caching 不僅是快取庫,更是快取抽象框架。核心抽象類別 ObjectCache 定義通用操作(Get/Set/Remove/Contains),內建 MemoryCache 為預設記憶體實作,開發者可繼承 ObjectCache 整合 Redis、Memcached 或自訂儲存後端。

核心架構三支柱

  1. ObjectCache:抽象契約,定義快取存取介面
  2. MemoryCache:生產級記憶體實作,支援絕對/滑動過期、回呼、記憶體壓力回收
  3. ChangeMonitor:快取失效觸發機制,支援檔案、SQL Server、自訂來源

ChangeMonitor:宣告式快取相依性

傳統快取依賴輪詢或硬編碼失效邏輯,ChangeMonitor 提供事件驅動的相依性聲明:

var cache = MemoryCache.Default;
var policy = new CacheItemPolicy();

// 檔案相依性:設定檔異動即失效
policy.ChangeMonitors.Add(new HostFileChangeMonitor(new[] { "config.json" }));

// SQL 相依性:資料表異動即失效 (需啟用 Service Broker)
policy.ChangeMonitors.Add(new SqlChangeMonitor("SELECT Col FROM dbo.Table"));

cache.Set("Key", data, policy);

自訂 ChangeMonitor 實作指南

框架要求繼承 ChangeMonitor 並正確實作:

  • UniqueId:唯一識別碼
  • Dispose():釋放監聽資源
  • 建構子中啟動監聽,偵測變更呼叫 OnChanged(null) 通知快取失效

文件詳盡規範了生命週期與執行緒安全要求,降低自訂實作風險。

實戰模式:多層快取策略

public T GetOrAdd<T>(string key, Func<T> factory, 
    IEnumerable<ChangeMonitor> monitors = null, 
    TimeSpan? slidingExpiration = null) 
{
    var cache = MemoryCache.Default;
    if (cache.Contains(key)) return (T)cache.Get(key);

    var policy = new CacheItemPolicy();
    if (slidingExpiration.HasValue) 
        policy.SlidingExpiration = slidingExpiration.Value;
    if (monitors != null)
        foreach (var m in monitors) policy.ChangeMonitors.Add(m);

    var value = factory();
    cache.Set(key, value, policy);
    return value;
}

遷移建議

  • ASP.NET Cache 物件仍可使用,但新專案優先採用 MemoryCache
  • 分散式場景建議封裝 ObjectCache 介面對接 Redis/NCache
  • 善用 ChangeMonitor 替代手工快取清除邏輯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved