系統需在使用者註冊或登入時檢查 IP 是否被封鎖。封鎖名單存放於資料表 IPBlocked,變動頻率低,適合快取;但一旦資料表異動,快取必須立即失效。SqlCacheDependency 正是為此設計:將快取項目與資料表綁定,資料變更自動觸發快取過期。
<system.web>
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add connectionStringName="regex_libConnectionString" name="IPBlockedDependency" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
connectionStringName 對應 <connectionStrings> 中的連線字串;name 為稍後程式碼引用的依賴名稱。
aspnet_regsql -C "Data Source=.;Initial Catalog=regex-lib;Integrated Security=True" -ed -et -t "IPBlocked"
-C:連線字串-ed:啟用資料庫快取依賴-et:啟用資料表快取依賴-t:目標資料表名稱執行後資料庫將新增 AspNet_SqlCacheTablesForChangeNotification 表,用於追蹤變更。
private static string[] GetBlockedIPs()
{
const string CacheKey = "BlockedIPs";
// 1. 嘗試從快取讀取
string[] ips = (string[])HttpContext.Current.Cache[CacheKey];
if (ips != null) return ips;
// 2. 從資料庫讀取
using (var db = new RxDataContext())
{
ips = db.IPBlockeds.Select(ipb => ipb.UserIP).ToArray();
}
// 3. 寫入快取並掛上 SqlCacheDependency
var depend = new SqlCacheDependency("IPBlockedDependency", "IPBlocked");
HttpContext.Current.Cache.Insert(CacheKey, ips, depend);
return ips;
}
SqlCacheDependency 建構子需傳入 web.config 定義的依賴名稱與資料表名。自此,IPBlocked 表任意異動(增/刪/改)皆會使快取自動失效,下一次呼叫將重新查詢資料庫。
此模式適用於「讀多寫少、資料變更需即時反映」的場景。設定一次,長期受益;亦可作為專案檢核清單(Checklist)留存備查。