今天要說的是在緩存時使用SqlCacheDependency。其應用場景是IP地址屏蔽,數據庫裡有一張表IPBlocked,記錄了被屏蔽的 IP。由於每次進行注冊或嘗試登錄時都要檢查IP,而IP屏蔽表又不會經常變化,所以需要使用緩存。並且該緩存依賴該數據表,即如果表中數據發生了變化,緩存應該失效。
好困啊,不多扯了,我這裡就給出操作步驟。
1. 修改web.config,啟用SqlCacheDependency。將下列代碼加入web.config的<system.web>節:
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add connectionStringName="regex_libConnectionString" name="IPBlockedDependency"/>
</databases>
</sqlCacheDependency>
</caching>
這裡的 connectionStringName指定了在<connectionStrings>中添加的某一個連接字符串。name則是為該SqlCacheDependency起的名字,這個名字將在第3步中用到。
2. 執行下述命令,為數據庫啟用緩存依賴:
C:\Program Files\Microsoft Visual Studio 9.0\VC>aspnet_regsql -C "Data Source=.;Initial Catalog=regex-lib;Integrated Security=True" -ed -et -t "IPBlocked"
這裡 -C後面的字符串是連接字符串(請替換成自己所需要的值),-t參數後面的字符串是數據表的名字。命令執行後,數據庫中會多出一個 AspNet_SqlCacheTablesForChangeNotification表。
3. 在代碼中使用緩存,並為其設置SqlCacheDependency依賴:
private static string[] GetBlockedIPs()
{
// 1嘗試從緩存中讀取
string[] ips = (string[])HttpContext.Current.Cache[BlockedIPCacheKey];
if (ips != null)
return ips;
// 2從數據庫中讀取
using (RxDataContext db = new RxDataContext())
{
ips = db.IPBlockeds.Select(ipb => ipb.UserIP).ToArray();
}
// 3放入緩存
SqlCacheDependency depend = new SqlCacheDependency("IPBlockedDependency", "IPBlocked");
HttpContext.Current.Cache.Insert(BlockedIPCacheKey, ips, depend);
return ips;
}
創建 SqlCacheDependency時需要指定web.config中定義的SqlCacheDependency名字,並指定數據表的名稱。
好了,這只是一個步驟列表,或者可以當作一個checklist用。