西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)其它知識(shí) → 網(wǎng)站性能應(yīng)用程序緩存優(yōu)化

網(wǎng)站性能應(yīng)用程序緩存優(yōu)化

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/9/19 22:08:08字體大小:A-A+

作者:佚名點(diǎn)擊:182次評(píng)論:0次標(biāo)簽: 網(wǎng)站 緩存

.NET程序編輯器(Reflexil)V1.6 免費(fèi)版
  • 類(lèi)型:編程輔助大。1.3M語(yǔ)言:中文 評(píng)分:4.5
  • 標(biāo)簽:
立即下載

一、上章回顧
上一章中我們主要簡(jiǎn)單的介紹了如何使用服務(wù)器緩存及如何實(shí)現(xiàn)服務(wù)器緩存,下面我們來(lái)通過(guò)下圖來(lái)進(jìn)行詳細(xì)回顧:

 

1、用戶(hù)發(fā)送頁(yè)面請(qǐng)求,等待服務(wù)器返回信息。

2、表示層通過(guò)請(qǐng)求業(yè)務(wù)層來(lái)訪(fǎng)問(wèn)業(yè)務(wù)數(shù)據(jù)信息。

3、業(yè)務(wù)層在與數(shù)據(jù)訪(fǎng)問(wèn)層交互時(shí)先與服務(wù)器緩存組件交互。

4、服務(wù)器緩存在接收數(shù)據(jù)請(qǐng)求并處理的過(guò)程中判定服務(wù)器緩存中是否存在指定的數(shù)據(jù)集緩存對(duì)象。如果存在則返回該緩存對(duì)象,否則通過(guò)數(shù)據(jù)訪(fǎng)問(wèn)層,訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),并把數(shù)據(jù)緩存在服務(wù)器組件中。并返回該查詢(xún)結(jié)果集。

5、表示層獲得數(shù)據(jù)集合后顯示。

二、摘要
本章將主要講解緩存中的過(guò)期策略及如何平衡過(guò)期這個(gè)過(guò)期策略,怎么樣在項(xiàng)目中解決這樣的問(wèn)題,這就是本篇要講述的內(nèi)容。

三、本章大綱
1、上章回顧。

2、摘要。

3、本章大綱。

4、具體策略分析。

5、緩存過(guò)期策略方案。

6、本章總結(jié)。

7、下篇預(yù)告。

四、具體策略分析
我們我們平時(shí)使用緩存中最頭疼的問(wèn)題應(yīng)該就是緩存的過(guò)期的問(wèn)題吧,緩存帶來(lái)的好處顯而易見(jiàn),不見(jiàn)提高了網(wǎng)站應(yīng)用程序的性能,同時(shí)提高了訪(fǎng)問(wèn)的速度,減少了與數(shù)據(jù)庫(kù)交互的次數(shù)。無(wú)疑是好的方案,所以網(wǎng)上有很多的建議都是,能緩存的數(shù)據(jù)盡量緩存,因?yàn)榫彺姹囟軒?lái)性能的提升。同時(shí)有個(gè)很大的問(wèn)題始終困擾著我們。這樣是我平時(shí)在使用緩存的過(guò)程中頭疼的問(wèn)題。例如這樣的情況:

 

所以問(wèn)題就隨之而來(lái),如何保證這個(gè)產(chǎn)品策略的過(guò)期性和同步性,當(dāng)然我們知道產(chǎn)品分類(lèi)一般情況下變化不大,所以我們緩存,對(duì)于信息變化或者改變頻率較高的數(shù)據(jù),我們當(dāng)然可以考慮每次加載的時(shí)候都緩存,等到第二次訪(fǎng)問(wèn)的時(shí)候過(guò)期這樣的方式來(lái)處理也是可以的?傊鼐褪遣唤(jīng)常改變的常用的數(shù)據(jù)信息能緩存的一定緩存。大家都知道2-8法則的,其實(shí)不管是什么程序基本上都滿(mǎn)足這個(gè)原則。

 

當(dāng)然Winform的程序則會(huì)比較復(fù)雜一些,可能制定的策略相對(duì)來(lái)說(shuō)也不好指定。因?yàn)橐话闱闆r下來(lái)說(shuō)客戶(hù)端/服務(wù)器這樣的形式,一般的數(shù)據(jù)信息都緩存在客戶(hù)端,這樣服務(wù)器壓力小一些,當(dāng)然也有弊端,就是每個(gè)客戶(hù)端都是有自己的快照副本,不過(guò)由于現(xiàn)在硬件的速度發(fā)展迅速,所以這方面的力度可以考慮加大,顯而易見(jiàn),當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)發(fā)生改變后,如何通知winform程序進(jìn)行緩存更新也是個(gè)重要的問(wèn)題,畢竟winform程序的緩存策略與web程序的緩存方式有所不同。當(dāng)然如果說(shuō)winform也是采用服務(wù)器端緩存的話(huà),當(dāng)然也可以采用上面我們討論的方式來(lái)實(shí)現(xiàn)更新策略。

下面我們來(lái)看看我理解的可操作的winform的緩存策略的更新。

 

當(dāng)然上面只是個(gè)人愚見(jiàn),不足之處還請(qǐng)大家多多指點(diǎn)。歡迎大家拍磚,下面我們來(lái)講講各種策略的實(shí)現(xiàn)及優(yōu)缺點(diǎn)。

五、緩存過(guò)期策略方案
上面我們簡(jiǎn)單的分析了,winform與web應(yīng)用程序的可能的緩存過(guò)期策略。下面我們來(lái)講講幾種可能的解決方案,當(dāng)然只是個(gè)人愚見(jiàn),還請(qǐng)大家拍磚,這里只是拋磚引玉,沒(méi)有考慮更復(fù)雜的情況。還請(qǐng)大家多多分享自己的經(jīng)驗(yàn)。

1、使用微軟提供的服務(wù)器緩存的過(guò)期策略:

a、相對(duì)過(guò)期。舉個(gè)簡(jiǎn)單例子就是,如果緩存對(duì)象在某個(gè)時(shí)間段內(nèi)沒(méi)有被訪(fǎng)問(wèn)過(guò),那么該對(duì)象則過(guò)期,否則則不過(guò)期。

 

b、絕對(duì)過(guò)期。舉個(gè)簡(jiǎn)單例子就是,不管緩存的對(duì)象訪(fǎng)問(wèn)沒(méi)有訪(fǎng)問(wèn)過(guò),只要到達(dá)設(shè)置的時(shí)間則過(guò)期。

 

 

 

具體的實(shí)現(xiàn)時(shí),我們可以參考通過(guò)配置文件中設(shè)置這個(gè)過(guò)期策略,例如我們參考IBatisNet中的緩存

 


1 <cacheModels>//緩存的對(duì)象列表

2 <cacheModel id="CacheLRU_Sys_UserRole" implementation="LRU" >//緩存的對(duì)象

3 <flushInterval minutes="2" />//設(shè)置過(guò)期策略

4 <flushOnExecute statement="Insert_Sys_UserRole"/>//刷新的動(dòng)作

5 <flushOnExecute statement="Update_Sys_UserRole"/>

6 <flushOnExecute statement="Delete_Sys_UserRole"/>

7 <property name="CacheSize" value="100"/>//設(shè)置緩存對(duì)象的大小

8 </cacheModel>

9 </cacheModels>


顯然通過(guò)上面提供的方式可以做到緩存對(duì)象的自動(dòng)過(guò)期,但是有個(gè)情況就是不夠靈活,如果緩存對(duì)象在指定的時(shí)間段內(nèi)已發(fā)生改變,那么必須在過(guò)期時(shí)間后才能更新緩存對(duì)象,那么有些時(shí)候顯然不能滿(mǎn)足我的要求,特別是實(shí)時(shí)性的系統(tǒng)時(shí)這樣的緩存策略是不可行的。

2、當(dāng)然上面介紹的IBatisNet中已包含設(shè)置刷新對(duì)象時(shí)的操作的設(shè)置:

 

1 <flushOnExecute statement="Insert_Sys_UserRole"/>//刷新的動(dòng)作

2 <flushOnExecute statement="Update_Sys_UserRole"/>

3 <flushOnExecute statement="Delete_Sys_UserRole"/>


那么體現(xiàn)在程序中的代碼如何書(shū)寫(xiě)呢,我們來(lái)看看。

 

01 /// <summary>

02 /// 定義委托、用于指向更新緩存的事件

03 /// </summary>

04 /// <returns>返回是否更新緩存</returns>

05 public delegate bool RefreshCache(object sender, EventArgs e);

06

07 /// <summary>

08 /// 維護(hù)緩存更新策略的委托集合

09 /// </summary>

10 public Dictionary<object, List<RefreshCache>> list;


 

那么通過(guò)XML配置相關(guān)的引發(fā)緩存更新的事件來(lái)達(dá)到更新緩存的目的。

那么每次委托列表中維護(hù)的對(duì)象即是所有的緩存對(duì)象的相關(guān)刷新動(dòng)作事件。通過(guò)檢測(cè)事件的執(zhí)行來(lái)更新緩存對(duì)象。

具體的更新緩存的代碼如下:

 

1 public void RefreshCacheObject(object key,bool isSuccess)

2 {

3 if (!isSuccess)

4 return;

5 if (list.ContainsKey(key))

6 list.Remove(key);

7

8 //載入緩存

9 }


具體的載入緩存的代碼請(qǐng)參考:網(wǎng)站性能優(yōu)化之應(yīng)用程序緩存-初篇

具體的實(shí)現(xiàn)底層通知的代碼我還沒(méi)有想好具體的實(shí)現(xiàn)方式(就是比較好的方式)。想好了會(huì)把代碼貼上,當(dāng)然IBatisNet已經(jīng)很優(yōu)秀了,我這里也許沒(méi)有造輪子的必要,如果誰(shuí)有比較好的實(shí)現(xiàn)方式,那么可以告訴我,我這里先謝過(guò)了,我其實(shí)不是很了解底層的實(shí)現(xiàn)機(jī)制,所以我目前只是采用比較笨的方式來(lái)做,雖然也實(shí)現(xiàn)了,但是需要在每個(gè)事件中都要顯示的寫(xiě)一部分代碼,這是我不能接受的。

3、時(shí)時(shí)更新的方式。

這里的時(shí)時(shí)更新就是指,每次都把數(shù)據(jù)庫(kù)中的記錄全部取出來(lái),然后循環(huán)比較結(jié)果集中的記錄與緩存的記錄是不是相同,如果不同則更新該記錄,否則跳過(guò)繼續(xù)處理其他的數(shù)據(jù)信息,那么保證緩存中的記錄始終是最新的。當(dāng)然這樣的方式雖然保證所有的緩存信息是最新的,但是每次都與數(shù)據(jù)庫(kù)交互顯然不是好的解決方案,當(dāng)然有些情況下也許也是沒(méi)有辦法的事情。

最后,本文只是拋磚引玉,希望大家多多提出寶貴意見(jiàn)。

六、本章總結(jié)
本文簡(jiǎn)單的介紹了web與winform下的緩存策略,分析了幾種方式的可行性及優(yōu)缺點(diǎn)等,還希望大家在實(shí)際的項(xiàng)目中根據(jù)項(xiàng)目的需要來(lái)指定緩存的過(guò)期策略,但是可以肯定的是,用緩存肯定比不用緩存的性能要高。當(dāng)然這里也不是要求我們?yōu)E用緩存,也要根據(jù)數(shù)據(jù)信息的更新頻度做一個(gè)平衡,不經(jīng)常變的數(shù)據(jù)一般推薦來(lái)緩存。畢竟服務(wù)器中有同一副本,不但能提高訪(fǎng)問(wèn)的效率,還能減輕數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)壓力,提高并發(fā)的速度。還需要大家在實(shí)際項(xiàng)目中體會(huì)。

七、下篇預(yù)告
本篇并沒(méi)有把IBatis.NET中的緩存策略完整的實(shí)現(xiàn),并且也沒(méi)有講到其他的一些winform的緩存策略的實(shí)現(xiàn),下一篇將會(huì)詳細(xì)的講解這部分的內(nèi)容,當(dāng)然這些都是本人的個(gè)人體會(huì)與總結(jié),錯(cuò)誤之處在所難免,歡迎大家提出不同意見(jiàn),批評(píng)指出錯(cuò)誤,謝謝大家!

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀(guān)圍觀(guān)
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)