熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

提高ASP.Net應用程序性能的十大方法[2]

2013-11-13 11:09:34  來源: .NET編程 

  四 ASPNET緩存API 

  在寫應用程序之前你要做的第一件事是讓應用程序最大化的利用ASPNET的緩存功能 

  如果你的組件是要在Aspnet應用程序中運行你只要把SystemWebdll引用到你的項目中就可以了然後用HttpRuntimeCache屬性就可訪問Cache了(也可以通過PageCache或HttpContextCache訪問) 

  有以下幾條緩存數據的規則第一數據可能會被頻繁的被使用這種數據可以緩存第二數據的訪問頻率非常高或者一個數據的訪問頻率不高但是它的生存周期很長這樣的數據最好也緩存起來第三是一個常常被忽略的問題有時候我們緩存了太多數據通常在一台X的機子上如果你要緩存的數據超過M的話就會出現內存溢出的錯誤所以說緩存是有限的換名話說你應該估計緩存集的大小把緩存集的大小限制在以內否則它可能會出問題在Aspnet中如果緩存過大的話也會報內存溢出錯誤特別是如果緩存大的DataSet對象的時候 

  這裡有幾個你必須了解的重要的緩存機制首先是緩存實現了最近使用原則( a leastrecentlyused algorithm)當緩存少的時候它會自動的強制清除那些無用的緩存其次 條件依賴強制清除原則(expiration dependencies)條件可以是時間關鍵字和文件以時間作為條件是最常用的在aspnet中增加一更強的條件就是數據庫條件當數據庫中的數據發生變化時就會強制清除緩存要更深入的了解數據庫條件依賴請看Dino Esposito 在MSDN雜志年七月刊的Cutting Edge專欄文章Aspnet的緩存架構如下圖所示 
   
  五 預請求緩存 

  在前面我提到過即使我們只對某些地方作了一個小小的性能改進也可以獲得大的性能提升我非常喜歡用預請求緩存來提升程序的性能 

  雖然Cache API設計成用來保存某段時間的數據而預請求緩存只是保存某個時期的某個請求的內容如果某個請求的訪問頻率高而且這個請求只需要提取應用修改或者更新數據一次那麼就可以預緩存該請求我們舉個例子來說明 

  在CS的論壇應用程序中每一個頁面的服務器控件都要求得到用於決定它的皮膚(skin)的自定義的數據以決定用哪個樣式表及其它的一些個性化的東西這裡面的某些數據可能要長時間的保存有些時間則不然如控件的skin數據它只需要應用一次而後就可以一直使用 

  要實現預請求緩存用Aspnet 的HttpContext類HttpContext類的實例在每一個請求中創建在請求期間的任何地方都可以通過HttpContextCurrent屬性訪問HttpContext類有一個Items集合屬性在請求期間所有的對象和數據都被添加到這個集合中緩存起來和你用Cache緩存訪問頻率高數據一樣你可以用HttpContextItems緩存那些每個請求都要用到的基礎數據它背後的邏輯很簡單我們向HttpContextItems中添加一個數據然後再從它裡面讀出數據 

  六 後台處理 

  通過上面的方法你的應用程序應該運行得很快了是不是?但是在某些時候程序中的一次請求中可能要執行一個非常耗時的任務如發送郵件或者是檢查提交的數據的正確性等 

  當我們把aspnet Forums 集成在CS中的時侯發現提交一個新的帖子的時候會非常的慢每次新增一個帖子的時侯應用程序首先要檢查這個帖子是不是重復提的然後用badword過濾器來過濾檢查圖片附加碼作帖子的索引把它添加到合適的隊列中驗證它的附件最後發郵件到它的訂閱者郵件箱中顯然這個工作量很大 

  結果是它把大量的時間都花在做索引和發送郵件中了做帖子的索引是一項很耗時的操作而發郵件給訂閱都需要連接到SMTP服務然後給每一個訂閱者都發一封郵件隨著訂閱用戶的增加發送郵件的時間會更長 

  索引和發郵件並不需要在每次請求時觸發理想狀態下我們想要批量的處理這些操作每次只發封郵件或者每隔分鐘把所有的要發的新郵件發一次我們決定使用與數據庫原型緩存一樣的代碼但是失敗了所以又不得不回到VSNET  

  我們在SystemThreading命名空間下找到了Timer類這個類非常有用但卻很少有人知道Web開發人員則更少有人知道了一旦他建了該類的實例每隔一個指定的時間Timer類就會從線程池中的一個線程中調用指定的回調函數這意味著你的aspnet應用程序可以在沒有請求的時候也可以運行這就是後以處理的解決方案你就可以讓做索引和發郵件工作在後台運行而不是在每次請求的時候必須執行 

  後台運行的技術有兩個問題第一是當你的應用程序域卸載後Timer類實例就會停止運行了也就是不會調用回調方法了另外因為CLR的每個進程中都有許多的線程在運行你將很難讓Timer獲得一個線程來執行它或者能執行它但會延時Aspnet層要盡量少的使用這種技術以減少進程中線程的數量或者只讓請求用一小部分的線程當然如果你有大量的異步工作的話那就只能用它了

[]  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15286.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.