SqlCacheDependency:數據表無變更時讀緩存,有變更時自動失效緩存並重新查庫,適用於「讀多寫少、準實時」的基礎數據(如新聞分類、字典表、配置表)。
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="6000"> <!-- 每 6 秒輪詢一次 -->
<databases>
<add name="YD_JWC_JAKE" connectionStringName="cachestr" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
<connectionStrings>
<add name="cachestr" connectionString="Data Source=127.0.0.1;Initial Catalog=YD_JWC_JAKE;User ID=sa;Password=****;" />
</connectionStrings>
name:依賴名稱,業務代碼中引用connectionStringName:對應 connectionStrings 中的 namepollTime:輪詢間隔(毫秒),權衡實時性與負載cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
aspnet_regsql -C "Data Source=127.0.0.1;Initial Catalog=YD_JWC_JAKE;User ID=sa;Password=****" -ed -et -t "T_NewsClass"
-C:連接字串(大寫 C)-ed:啟用數據庫級依賴(創建 AspNet_SqlCacheTablesForChangeNotification 表、觸發器、存儲過程)-et:啟用表級依賴-t:指定表名(多表重複執行)AspNet_SqlCacheTablesForChangeNotification、各表觸發器、AspNet_SqlCacheUpdateChangeIdStoredProcedure 等private void GetInfoClass(int type) {
string cacheKey = "cacheclass" + type;
object obj = DataCache.GetCache(cacheKey);
DataTable dt = null;
if (obj == null) { // 緩存未命中
NewsClassBLL nc = new NewsClassBLL();
dt = nc.GetList("").Tables[0];
obj = dt;
if (obj != null) {
// 關鍵:創建 SqlCacheDependency 綁定表變更
SqlCacheDependency dep = new SqlCacheDependency("YD_JWC_JAKE", "T_NewsClass");
DataCache.SetCache(cacheKey, obj, dep); // 存入緩存並掛載依賴
}
} else {
dt = (DataTable)obj; // 緩存命中,直接用
}
// 渲染輸出...
DataRow[] rows = dt.Select("", "classid");
StringBuilder sb = new StringBuilder("");
foreach (DataRow r in rows) {
string cid = Security.EncryptQueryString(r["ClassId"].ToString(), ConfigHelper.GetConfigString("DecryStr"));
string cdesc = r["ClassDesc"].ToString();
string url = (type==1) ? "/Info" + cid + ".shtml" :
(type==2) ? "/File" + cid + ".shtml" : "/FAQ" + cid + ".shtml";
sb.AppendFormat("- {1}
", url, cdesc);
}
sb.Append("
");
Response.Write(sb.ToString());
}
public static class DataCache {
private static Cache Cache { get { return HttpRuntime.Cache; } }
public static object GetCache(string key) {
return Cache[key];
}
public static void SetCache(string key, object value) {
Cache.Insert(key, value);
}
public static void SetCache(string key, object value, CacheDependency dependency) {
Cache.Insert(key, value, dependency,
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.Default, null);
}
}
| 項目 | 說明 |
|---|---|
| 輪詢間隔 | pollTime 不宜太小(如 <1000ms),高併發下會頻繁查 AspNet_SqlCacheTablesForChangeNotification 表 |
| 表結構變更 | DDL 變更(加列、改類型)會導致依賴失效需重新 aspnet_regsql -et -t |
| 權限 | 連接賬號需有 CREATE TABLE、CREATE PROCEDURE、CREATE TRIGGER 權限(啟用時),運行時需 SELECT 監控表 |
| 集群/鏡像 | 故障轉移後依賴自動有效(監控表在用戶庫中) |
| 非 ASP.NET 環境 | 可用 System.Web.Caching.SqlCacheDependency 庫引用,但需手動輪詢 |