ASP.NET強大的SqlCacheDependency

 最近我在忙於研究負載平衡、併發性容錯性等性能優化問題,ASP.NET有太多強大的功能等待學習和挖掘。今天,Kim和大家一起研究在ASP.NET中緩存機制如何幫助我們在高流量網站中減少服務器負擔。

何爲緩存
         緩存無處不在,尤其是流量較高的網站。對於某些頁面(尤其是帶有一個或更多數據庫操作的頁面)可能會對數據庫服務器帶來過大的負載,而這些負載經常是不必要的。比如某公司的商品清單頁面可能在一個小時,一天甚至更長時間並未改變,遺憾的是每一個瀏覽該頁面的用戶都會造成數據庫的連接及查詢。緩存就是爲了解決這樣的問題應運而生。
緩存的簡單實現
          在ASP.NET中實現緩存的最簡單的方法就是在頁面上加一個OutputCache標籤。
<% @ OutputCache Duration ="20" VaryByParam ="*" %>
    其中Duration指定了緩存的過期時間。上面的句子表示該頁面的數據庫查詢操作在20秒內會自動保存到緩存中,不再重複連接數據庫,在高流量的網站中大大減輕了數據庫的負載。
沒有免費午餐
         PageCache簡單好用,可是有點小小的問題。例如在一個論壇中的首頁往往都會用到PageCache,這樣最新發表的帖子不會立即顯示在首頁上,而是需要等待一段時間(緩存過期)後纔會出現,而這種延遲在某些場合是完全不允許的。比如購物商城的網站,某人已經訂購了最後一批貨物,而由於緩存機制,其他人查看狀態時依然是訂購前的(未被訂購),我想你不會希望兩個人買你僅有的一件商品。ASP.NET裏面的Cache並不能自動根據數據庫中相應數據發生了變化,而使相應的Cache過期,ASP.NET 2.0中新增的SqlCacheDependency特性使這成爲了可能。我們今天的主題就此引出。
強大的SqlCacheDependency
SqlCacheDependency在保證更新同步的前提下通過緩存減小數據庫負載。那麼如何使用它呢?
1、 使數據庫支持SqlCacheDependency
 
在.Net Framework 2.0 的安裝目錄下(通常是WINDOWS/Microsoft.NET/Framework/v2.0.XXXXX),有一個aspnet_regsql.exe,這個命令行工具可以幫助我們使數據庫支持SqlCacheDependency特性,

首先:“aspnet_regsql  –S 服務器名 –U 登陸名 ID –P 密碼 –d 數據庫名  –ed”,這個命令使指定數據庫支持SqlCacheDependency, 
然後我們再加入要追蹤的數據表:“aspnet_regsql –S 服務器名  –U 登陸名 ID –P 密碼 –d 數據庫名 –t 追蹤的數據表 –et”,這個命令使指定的Table支持SqlCacheDependency。 
指令運行後,在指定的數據庫中會新建一個Table,叫做“AspNet_SqlCacheTablesForChangeNotification”,這個表有三個字段,“tableName”記錄要追蹤的數據表的名稱,“notificationCreated”記錄開始追蹤的時間,“changeId”是一個int類型的字段,每當追蹤的數據表的數據發生變化時,這個字段的值就加1。 
它還會在指定的數據庫中增加幾個存儲過程,用來讓ASP.NET引擎查詢追蹤的數據表的情況。 
然後,它會給我們要追蹤的Table加上幾個Trigger,分別對應到Insert、Update、Delete操作,這幾個Trigger的語句非常簡單,就是把“AspNet_SqlCacheTablesForChangeNotification”表中對應“tableName”字段爲這個追蹤的表的名稱的記錄的“changeId”字段加上一個1。 
ASP.NET引擎通過執行它加上的存儲過程“AspNet_SqlCachePollingStoredProcedure”,這個存儲過程直接返回“AspNet_SqlCacheTablesForChangeNotification”表的內容,讓ASP.NET引擎知道哪個表的數據發生的變化。默認每500毫秒執行這個存儲過程一次,不過可以在web.config裏面修改這個間隔時間。

2、 web.config配置
  < system.web >
    <!-- 配置Cache 結點 , 使網站 支持SqlCacheDependency -->
    < cache >
      < sqlCacheDependency enabled = " true " pollTime = " 500 " >
        < databases >
          < add name = " CacheDB " connectionStringName = " CS " />
        </ databases >
      </ sqlCacheDependency >
    </ cache >
</ system.web >
3、 在頁面上的outputCache標籤中指定SqlCacheDependency特性:
 
<% @ OutputCache Duration ="9999" VaryByParam ="None" SqlDependency ="CacheDB:TableName" %>
其中TableName爲追蹤的表名,只要在這個追蹤的Table上執行了Insert、Update、Delete操作,數據表上的Trigger就會將數據庫中“ AspNet_SqlCacheTablesForChangeNotification”表的相應記錄的相應“changId”字段值修改,然後ASP.NET 引擎就會通過獲取新的值來得知追蹤的Table的內容發生了變化,自動使這個頁面的cache失效
最後
        同樣的網站,同樣的功能,在 安全性 、 併發性 、 容錯性 很多方面都會有所不同,而網站的好壞並不是看他有多少花哨的功能或多麼華麗的界面,而是他是否實用、穩定、效率、安全。 ASP.NET

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章