在「他舅網 WAP 流量統計分析平台」開發中,為提升效能大量使用 Cache,但面臨資料同步與失效時機的挑戰。本文分享兩種 CacheDependency 實戰模式:檔案依賴與 SQL 快取依賴。
將使用者權限序列化為 XML 檔案,管理員更新資料時同步寫入檔案,Cache 綁定檔案變更自動失效。
XmlDocument doc = Cache["user"] as XmlDocument;
if (doc == null)
{
doc = new XmlDocument();
string filePath = Server.MapPath("user.xml");
CacheDependency dep = new CacheDependency(filePath);
doc.Load(filePath);
Cache.Insert("skin", doc, dep
, Cache.NoAbsoluteExpiration
, TimeSpan.FromMinutes(30));
}
優點:實作簡單、即時失效。
適用:單機部署、資料更新頻率低、結構簡單的設定檔。
針對資料庫表格變更自動使 Cache 失效,適合分散式部署與高頻更新場景。
<configuration>
<connectionStrings>
<add name="connStr" connectionString="server=192.168.1.24;uid=sa;pwd=l23;database=CacheTest;"/>
</connectionStrings>
<system.web>
<caching>
<sqlCacheDependency>
<databases>
<add name="entryName" connectionStringName="connStr" pollTime="50000"/>
</databases>
</sqlCacheDependency>
</caching>
</system.web>
</configuration>
-- 啟用資料庫 Broker
ALTER DATABASE CacheTest SET ENABLE_BROKER;
-- 建立佇列與服務
CREATE QUEUE ContactChangeQueue;
CREATE SERVICE ContactChangeService ON QUEUE ContactChangeQueue ([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
-- 啟用表格通知
CREATE TRIGGER tr_Contact_Change ON Contacts
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
-- 通知機制由 SqlDependency 自動處理,無需手動發送
END
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("SELECT Id, Name FROM dbo.Contacts", conn))
{
var dep = new SqlCacheDependency(cmd);
var adapter = new SqlDataAdapter(cmd);
var dt = new DataTable();
adapter.Fill(dt);
Cache.Insert("contacts", dt, dep);
}
| 維度 | 檔案依賴 | SQL 依賴 |
|---|---|---|
| 部署架構 | 單機/共享磁碟 | 分散式/資料庫叢集 |
| 即時性 | 檔案系統通知 (近即時) | 查詢通知/輪詢 (可配置 pollTime) |
| 複雜度 | 低 | 高 (需資料庫權限、Broker、佇列) |
| 資料類型 | 任意序列化物件 | DataTable/DataSet/自訂物件 |
SlidingExpiration 平衡記憶體與命中率。