使用Cache提高ASP.NET性能
使用Cache提高ASP.NET性能
雖然現在已經是寬帶時代,小貓已經離我們漸漸遠去,可作為WEB應用開發者來說,我們仍然有責任和義務不斷地通過技術手段來優化WEB應用性能,讓用戶瀏覽時少一些等待,多一些爽快。
所幸的是,ASP.NET作為基于.Net Framework的WEB開發技術,它也享用著.Net Framework的優越性,.Net Framework為我們提供了良好的Cache技術,使我們能開發出速度更快、用戶體驗更好的WEB應用。命名空間System.Web.Caching提供了Cache類,其Cache的有效性依賴分以下三種情況:
1.時間點(指定時間點內有效);
2.KEY值(KEY值作Cache項標識);
3.文件或目錄(指定文件或目錄變更,則原Cache項不可用);
下面我就結合實際開發的應用跟大家分享一下使用Cache提高ASP.NET性能。
我們在開發中常常會遇到讀取記錄列表(例如最近更新的新聞列表Top N)、記錄本身(例如一條新聞),用戶訪問的時候,這樣的信息是否每次都要重復從數據庫中讀取呢?聰明的你可能知道,這完全是沒必要的。
我們為了方便處理,不防設計一個SiteCache類(借鑒了CS中的CSCache.cs),并提供若干靜態方法,來負責處理Cache項的添加和刪除。下面給出類圖:
其實該類主要就是利用前文所提及的關于Cache依賴項的第一點與第二點的特性來維護我們自己的Cache項。有了SiteCache類,接下來看看如何使用它。還是以讀取新聞TonN列表為例:
- public static RecordSet GetNewsSetTopN(string classCode,int topN,
SortPostsBy orderBy, SortOrder sortOrder, string language)- {
- string cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}",
language,classCode,topN.ToString(), orderBy.ToString(),sortOrder.ToString());- //從上下文中讀緩存項
- RecordSet newsSet = HttpContext.Current.Items[cacheKey] as RecordSet;
- if (newsSet == null)
- {
- //從HttpRuntime.Cache讀緩存項
- newsSet = SiteCache.Get(cacheKey) as RecordSet;
- if (newsSet == null)
- {
- //直接從數據庫從讀取
- CommonDataProvider dp=CommonDataProvider.Instance();
- newsSet =dp.GetNewsSetTopN(language,classCode,topN,orderBy,sortOrder);
- //并將結果緩存到HttpRuntime.Cache中
- SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
- }
- }
- return newsSet;
- }
這樣在5分鐘內就不用重復訪問數據庫了來讀該列表了,當然,也有人會問,如果在這5分鐘內某條新聞刪除了或修改了怎么辦,沒關系,我們在刪除或修改時可以根據Cache KEY來強制刪除該Cache項,當然,如果你覺得你對列表的時效性不是特別在意,你可以不強制刪除該Cache項,讓Cache項定義的時間點自動失效。當然,最好還是提供一個方法按匹配模式項來強行刪除Cache項就可以了,例如:
- /// <summary>
- /// 刪除匹配的NewsSetTopN列表的Cache項
- /// </summary>
- public static void ClearNewsSetTopNCache(string language,
string classCode,int topN)- {
- string cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}",
language,classCode,topN.ToString());- SiteCache.RemoveByPattern(cacheKey);
- }
發布新聞后調用靜態方法ClearNewsSetTopNCache()強行清除原來的TopN緩存項,例如:
- /// <summary>
- /// 發布(新建)新聞
- /// </summary>
- /// <param name="post">新聞實例</param>
- /// <returns>返回狀態</returns>
- public static int Create(News post)
- {
- int status;
- CommonDataProvider dp=CommonDataProvider.Instance();
- dp.CreateUpdateDeleteNews(post, DataAction.Create, out status);
- //強制清除匹配的緩存項
- ClearNewsSetTopNCache (post.Language, post.ClassCode,Globals.
GetSiteSetting.NewsListTopN);- return status;
- }
以上介紹使用Cache提高ASP.NET性能。
【編輯推薦】