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

ASP.NET CacheHelper 封裝:靜態泛型操作、鍵枚舉與全量清理實戰

     編輯:關於ASP.NET

封裝 System.Web.Caching.Cache 為靜態泛型 CacheHelper,提供型別安全獲取、依賴/優先級/回調插入、鍵列舉、全量移除等實用功能,減少資料庫查詢、降低伺服器壓力。

CacheHelper 完整實現

public static class CacheHelper {
    private static readonly Cache _cache = HttpRuntime.Cache; // 推薦 HttpRuntime.Cache
    public static double DefaultMinutes { get; set; } = 15.0;

    // === 獲取 ===
    public static object Get(string key) 
        => string.IsNullOrEmpty(key) ? null : _cache.Get(key);

    public static T Get<T>(string key) {
        var obj = Get(key);
        return obj == null ? default : (T)obj;
    }

    // === 插入(多載鏈) ===
    public static void Insert(string key, object value, 
        CacheDependency dep = null, 
        CacheItemPriority priority = CacheItemPriority.Default,
        CacheItemRemovedCallback callback = null) {
        if (string.IsNullOrEmpty(key) || value == null) return;
        _cache.Insert(key, value, dep, 
            Cache.NoAbsoluteExpiration, 
            TimeSpan.FromMinutes(DefaultMinutes), 
            priority, callback);
    }

    // === 移除 ===
    public static void Remove(string key) {
        if (string.IsNullOrEmpty(key)) return;
        _cache.Remove(key);
    }

    // === 枚舉所有鍵 ===
    public static IReadOnlyList<string> GetKeys() {
        var keys = new List<string>();
        var enumerator = _cache.GetEnumerator();
        while (enumerator.MoveNext())
            keys.Add(enumerator.Key as string);
        return keys.AsReadOnly();
    }

    // === 全量清理 ===
    public static void RemoveAll() {
        foreach (var key in GetKeys())
            _cache.Remove(key);
    }
}

使用範例

// 1. 型別安全獲取/設定
var user = CacheHelper.Get<UserProfile>($"user:{uid}");
if (user == null) {
    user = UserService.GetProfile(uid);
    CacheHelper.Insert($"user:{uid}", user); // 15 分鐘滑動過期
}

// 2. 依賴檔案變更自動失效
var dep = new CacheDependency(Server.MapPath("~/config/site.xml"));
CacheHelper.Insert("site:config", LoadConfig(), dep);

// 3. 移除特定前綴所有快取(如用戶資料更新後)
var prefix = $"user:{uid}:";
foreach (var key in CacheHelper.GetKeys().Where(k => k.StartsWith(prefix)))
    CacheHelper.Remove(key);

// 4. 應用啟動預熱 / 部署後全量清理
CacheHelper.RemoveAll();

進階擴展建議

  • 分散式快取:替換底層為 IDistributedCache (Redis/SQL Server),介面不變。
  • 快取標籤/分組:維護 Dictionary<string, HashSet<string>> 標籤→鍵映射,支援 RemoveByTag("user")。
  • 快取統計:命中率、大小、驅逐計數,對接監控系統。
  • 序列化策略:分散式場景需序列化(JSON/Protobuf),本地快取可直接存物件引用。

常見誤區與避坑

誤區後果正確做法
靜態字典替代 Cache無過期策略、記憶體洩漏、進程隔離使用 HttpRuntime.Cache 內建 LRU 驅逐
快取大型物件圖序列化慢、記憶體碎片、反序列化風險快取扁平 DTO、或分散式快取
依賴快取做業務關鍵邏輯快取遺失導致功能失效快取為優化手段,必有回源兜底
忽略併發競態緩存擊穿、重複計算雙重檢查鎖 / Lazy<T> / 分散式鎖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved