
| 層次 | 存儲介質 | 適用數據 | 過期策略 |
|---|---|---|---|
| L1: 對象緩存 | Heap (HttpRuntime.Cache) | 熱點實體、計算結果、會話數據 | 滑動過期 + 依賴項 |
| L2: 數據緩存 | Redis / SQL Server | 共享數據、集群同步、持久化需求 | TTL + 版本號 |
| L3: XML 緩存 | 文件系統 / Blob | 配置文件、報表模板、靜態化片段 | 文件監視 + 手動刷新 |
public interface ICacheProvider {
T Get(string key);
void Set(string key, T value, TimeSpan? sliding = null, CacheDependency dependency = null);
void Remove(string key);
void Clear();
}
public interface ICacheLoader {
T Load(string key); // 緩存未命中時加載
IEnumerable GetDependencies(T value); // 依賴項鍵
}
public T Get(string key, ICacheLoader loader) {
if (_cache.TryGetValue(key, out T value)) return value;
lock (_locks.GetOrAdd(key, k => new object())) {
if (_cache.TryGetValue(key, out value)) return value;
value = loader.Load(key);
if (value != null) {
var deps = loader.GetDependencies(value)
.Select(d => new CacheItemDependency(d)).ToArray();
_cache.Set(key, value, _defaultSliding, deps);
}
return value;
}
}
// 實體更新時
public void UpdateEntity(Entity entity) {
_repo.Update(entity);
// 失效直接緩存
_cache.Remove($"entity:{entity.Id}");
// 失效關聯列表緩存
_cache.RemoveByPattern($"list:{entity.Type}:*");
// 發布事件通知其他節點 (Redis Pub/Sub)
_bus.Publish(new CacheInvalidatedEvent(entity.Id, entity.Type));
}