强大的SqlCacheDependency
最近我在忙于研究負(fù)載平衡、并發(fā)性容錯(cuò)性等性能優(yōu)化問(wèn)題,ASP.NET有太多強(qiáng)大的功能等待學(xué)習(xí)和挖掘。今天,Bosnma和大家一起研究在A(yíng)SP.NET中緩存機(jī)制如何幫助我們?cè)诟吡髁烤W(wǎng)站中減少服務(wù)器負(fù)擔(dān)。
何為緩存????????? 緩存無(wú)處不在,尤其是流量較高的網(wǎng)站。對(duì)于某些頁(yè)面(尤其是帶有一個(gè)或更多數(shù)據(jù)庫(kù)操作的頁(yè)面)可能會(huì)對(duì)數(shù)據(jù)庫(kù)服務(wù)器帶來(lái)過(guò)大的負(fù)載,而這些負(fù)載經(jīng)常是不必要的。比如某公司的商品清單頁(yè)面可能在一個(gè)小時(shí),一天甚至更長(zhǎng)時(shí)間并未改變,遺憾的是每一個(gè)瀏覽該頁(yè)面的用戶(hù)都會(huì)造成數(shù)據(jù)庫(kù)的連接及查詢(xún)。緩存就是為了解決這樣的問(wèn)題應(yīng)運(yùn)而生。緩存的簡(jiǎn)單實(shí)現(xiàn)?????????? 在A(yíng)SP.NET中實(shí)現(xiàn)緩存的最簡(jiǎn)單的方法就是在頁(yè)面上加一個(gè)OutputCache標(biāo)簽。<% @ OutputCache Duration ="20" VaryByParam ="*" %>???? 其中Duration指定了緩存的過(guò)期時(shí)間。上面的句子表示該頁(yè)面的數(shù)據(jù)庫(kù)查詢(xún)操作在20秒內(nèi)會(huì)自動(dòng)保存到緩存中,不再重復(fù)連接數(shù)據(jù)庫(kù),在高流量的網(wǎng)站中大大減輕了數(shù)據(jù)庫(kù)的負(fù)載。沒(méi)有免費(fèi)午餐????????? PageCache簡(jiǎn)單好用,可是有點(diǎn)小小的問(wèn)題。例如在一個(gè)論壇中的首頁(yè)往往都會(huì)用到PageCache,這樣最新發(fā)表的帖子不會(huì)立即顯示在首頁(yè)上,而是需要等待一段時(shí)間(緩存過(guò)期)后才會(huì)出現(xiàn),而這種延遲在某些場(chǎng)合是完全不允許的。比如購(gòu)物商城的網(wǎng)站,某人已經(jīng)訂購(gòu)了最后一批貨物,而由于緩存機(jī)制,其他人查看狀態(tài)時(shí)依然是訂購(gòu)前的(未被訂購(gòu)),我想你不會(huì)希望兩個(gè)人買(mǎi)你僅有的一件商品。ASP.NET里面的Cache并不能自動(dòng)根據(jù)數(shù)據(jù)庫(kù)中相應(yīng)數(shù)據(jù)發(fā)生了變化,而使相應(yīng)的Cache過(guò)期,ASP.NET 2.0中新增的SqlCacheDependency特性使這成為了可能。我們今天的主題就此引出。強(qiáng)大的SqlCacheDependency?SqlCacheDependency在保證更新同步的前提下通過(guò)緩存減小數(shù)據(jù)庫(kù)負(fù)載。那么如何使用它呢?1、 使數(shù)據(jù)庫(kù)支持SqlCacheDependency?在.Net Framework 2.0 的安裝目錄下(通常是WINDOWS\Microsoft.NET\Framework\v2.0.XXXXX),有一個(gè)aspnet_regsql.exe,這個(gè)命令行工具可以幫助我們使數(shù)據(jù)庫(kù)支持SqlCacheDependency特性,
首先:“aspnet_regsql? –S 服務(wù)器名 –U 登陸名 ID –P 密碼 –d 數(shù)據(jù)庫(kù)名? –ed”,這個(gè)命令使指定數(shù)據(jù)庫(kù)支持SqlCacheDependency,??然后我們?cè)偌尤胍粉櫟臄?shù)據(jù)表:“aspnet_regsql –S 服務(wù)器名? –U 登陸名 ID –P 密碼 –d 數(shù)據(jù)庫(kù)名 –t 追蹤的數(shù)據(jù)表 –et”,這個(gè)命令使指定的Table支持SqlCacheDependency。?指令運(yùn)行后,在指定的數(shù)據(jù)庫(kù)中會(huì)新建一個(gè)Table,叫做“AspNet_SqlCacheTablesForChangeNotification”,這個(gè)表有三個(gè)字段,“tableName”記錄要追蹤的數(shù)據(jù)表的名稱(chēng),“notificationCreated”記錄開(kāi)始追蹤的時(shí)間,“changeId”是一個(gè)int類(lèi)型的字段,每當(dāng)追蹤的數(shù)據(jù)表的數(shù)據(jù)發(fā)生變化時(shí),這個(gè)字段的值就加1。?它還會(huì)在指定的數(shù)據(jù)庫(kù)中增加幾個(gè)存儲(chǔ)過(guò)程,用來(lái)讓ASP.NET引擎查詢(xún)追蹤的數(shù)據(jù)表的情況。?然后,它會(huì)給我們要追蹤的Table加上幾個(gè)Trigger,分別對(duì)應(yīng)到Insert、Update、Delete操作,這幾個(gè)Trigger的語(yǔ)句非常簡(jiǎn)單,就是把“AspNet_SqlCacheTablesForChangeNotification”表中對(duì)應(yīng)“tableName”字段為這個(gè)追蹤的表的名稱(chēng)的記錄的“changeId”字段加上一個(gè)1。?ASP.NET引擎通過(guò)執(zhí)行它加上的存儲(chǔ)過(guò)程“AspNet_SqlCachePollingStoredProcedure”,這個(gè)存儲(chǔ)過(guò)程直接返回“AspNet_SqlCacheTablesForChangeNotification”表的內(nèi)容,讓ASP.NET引擎知道哪個(gè)表的數(shù)據(jù)發(fā)生的變化。默認(rèn)每500毫秒執(zhí)行這個(gè)存儲(chǔ)過(guò)程一次,不過(guò)可以在web.config里面修改這個(gè)間隔時(shí)間。
2、 web.config配置?? < system.web >???? <!-- 配置Cache 結(jié)點(diǎn) , 使網(wǎng)站 支持SqlCacheDependency -->???? < cache >?????? < sqlCacheDependency enabled = " true " pollTime = " 500 " >???????? < databases >?????????? < add name = " CacheDB " connectionStringName = " CS " />???????? </ databases >?????? </ sqlCacheDependency >???? </ cache >?</ system.web >?3、 在頁(yè)面上的outputCache標(biāo)簽中指定SqlCacheDependency特性:?<% @ OutputCache Duration ="9999" VaryByParam ="None" SqlDependency ="CacheDB:TableName" %>?其中TableName為追蹤的表名,只要在這個(gè)追蹤的Table上執(zhí)行了Insert、Update、Delete操作,數(shù)據(jù)表上的Trigger就會(huì)將數(shù)據(jù)庫(kù)中“ AspNet_SqlCacheTablesForChangeNotification”表的相應(yīng)記錄的相應(yīng)“changId”字段值修改,然后ASP.NET 引擎就會(huì)通過(guò)獲取新的值來(lái)得知追蹤的Table的內(nèi)容發(fā)生了變化,自動(dòng)使這個(gè)頁(yè)面的cache失效?最后???????? 同樣的網(wǎng)站,同樣的功能,在 安全性 、 并發(fā)性 、 容錯(cuò)性 很多方面都會(huì)有所不同,而網(wǎng)站的好壞并不是看他有多少花哨的功能或多么華麗的界面,而是他是否實(shí)用、穩(wěn)定、效率、安全。 ASP.NET 博大精深,看來(lái)好多東西,都是“越學(xué)越淺”的。
總結(jié)
以上是生活随笔為你收集整理的强大的SqlCacheDependency的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 叮当应急上征信吗
- 下一篇: 工商银行信用卡如何提额