首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

善用 SqlCacheDependency 實現資料表變更即時失效的快取策略

     編輯:關於.NET

應用場景:IP 封鎖名單快取

系統需在使用者註冊或登入時檢查 IP 是否被封鎖。封鎖名單存放於資料表 IPBlocked,變動頻率低,適合快取;但一旦資料表異動,快取必須立即失效。SqlCacheDependency 正是為此設計:將快取項目與資料表綁定,資料變更自動觸發快取過期。

三步完成設定

1. 修改 web.config 啟用 SqlCacheDependency

<system.web>
  <caching>
    <sqlCacheDependency enabled="true">
      <databases>
        <add connectionStringName="regex_libConnectionString" name="IPBlockedDependency" />
      </databases>
    </sqlCacheDependency>
  </caching>
</system.web>

connectionStringName 對應 <connectionStrings> 中的連線字串;name 為稍後程式碼引用的依賴名稱。

2. 執行 aspnet_regsql 啟用資料庫通知

aspnet_regsql -C "Data Source=.;Initial Catalog=regex-lib;Integrated Security=True" -ed -et -t "IPBlocked"
  • -C:連線字串
  • -ed:啟用資料庫快取依賴
  • -et:啟用資料表快取依賴
  • -t:目標資料表名稱

執行後資料庫將新增 AspNet_SqlCacheTablesForChangeNotification 表,用於追蹤變更。

3. 程式碼中套用快取依賴

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)留存備查。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved