封裝 System.Web.Caching.Cache 為靜態泛型 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")。| 誤區 | 後果 | 正確做法 |
|---|---|---|
| 靜態字典替代 Cache | 無過期策略、記憶體洩漏、進程隔離 | 使用 HttpRuntime.Cache 內建 LRU 驅逐 |
| 快取大型物件圖 | 序列化慢、記憶體碎片、反序列化風險 | 快取扁平 DTO、或分散式快取 |
| 依賴快取做業務關鍵邏輯 | 快取遺失導致功能失效 | 快取為優化手段,必有回源兜底 |
| 忽略併發競態 | 緩存擊穿、重複計算 | 雙重檢查鎖 / Lazy<T> / 分散式鎖 |