小議優(yōu)化ASP.NET應(yīng)用性能之Cache篇_.Net教程
推薦:在ASP.Net 2.0中實(shí)現(xiàn)多語(yǔ)言界面的方法1、跟以前一樣做界面,只是注意,把所有需要有多語(yǔ)言界面的文字都用label來(lái)做 2、做完以后,在Solution Explorer里選中這個(gè)文件,選Tools->Generate Local Resource 3、你會(huì)發(fā)現(xiàn)生成了一
雖然現(xiàn)在已經(jīng)是寬帶時(shí)代,小貓已經(jīng)離我們漸漸遠(yuǎn)去,可作為WEB應(yīng)用開(kāi)發(fā)者來(lái)說(shuō),我們?nèi)匀挥胸?zé)任和義務(wù)不斷地通過(guò)技術(shù)手段來(lái)優(yōu)化WEB應(yīng)用性能,讓用戶瀏覽時(shí)少一些等待,多一些爽快。
所幸的是,ASP.NET作為基于.Net Framework的WEB開(kāi)發(fā)技術(shù),它也享用著.Net Framework的優(yōu)越性,.Net Framework為我們提供了良好的Cache技術(shù),使我們能開(kāi)發(fā)出速度更快、用戶體驗(yàn)更好的WEB應(yīng)用。命名空間System.Web.Caching提供了Cache類,其Cache的有效性依賴分以下三種情況:
1、時(shí)間點(diǎn)(指定時(shí)間點(diǎn)內(nèi)有效);
2、KEY值(KEY值作Cache項(xiàng)標(biāo)識(shí));
3、文件或目錄(指定文件或目錄變更,則原Cache項(xiàng)不可用);
下面我就結(jié)合實(shí)際開(kāi)發(fā)的應(yīng)用跟大家分享一下使用Cache來(lái)提高ASP.NET應(yīng)用的性能。
我們?cè)陂_(kāi)發(fā)中常常會(huì)遇到讀取記錄列表(例如最近更新的新聞列表Top N)、記錄本身(例如一條新聞),用戶訪問(wèn)的時(shí)候,這樣的信息是否每次都要重復(fù)從數(shù)據(jù)庫(kù)中讀取呢?聰明的你可能知道,這完全是沒(méi)必要的。
我們?yōu)榱朔奖闾幚恚环涝O(shè)計(jì)一個(gè)SiteCache類(借鑒了CS中的CSCache.cs),并提供若干靜態(tài)方法,來(lái)負(fù)責(zé)處理Cache項(xiàng)的添加和刪除。
代碼:
以下為引用的內(nèi)容: SiteCache.cs 1using System; 2using System.Collections; 3using System.Text.RegularExpressions; 4using System.Web; 5using System.Web.Caching; 6 7namespace Ycweb.Components 8{ 9 public class SiteCache 10 { 11 private static readonly Cache _cache; 12 public static readonly int DayFactor; 13 private static int Factor; 14 public static readonly int HourFactor; 15 public static readonly int MinuteFactor; 16 17 static SiteCache() 18 { 19 DayFactor = 17280; 20 HourFactor = 720; 21 MinuteFactor = 12; 22 Factor = 5; 23 _cache = HttpRuntime.Cache; 24 } 25 26 private SiteCache() 27 { 28 } 29 30 public static void Clear() 31 { 32 IDictionaryEnumerator enumerator = _cache.GetEnumerator(); 33 while (enumerator.MoveNext()) 34 { 35 _cache.Remove(enumerator.Key.ToString()); 36 } 37 } 38 39 public static object Get(string key) 40 { 41 return _cache[key]; 42 } 43 44 public static void Insert(string key, object obj) 45 { 46 Insert(key, obj, null, 1); 47 } 48 49 public static void Insert(string key, object obj, int seconds) 50 { 51 Insert(key, obj, null, seconds); 52 } 53 54 public static void Insert(string key, object obj, CacheDependency dep) 55 { 56 Insert(key, obj, dep, HourFactor*12); 57 } 58 59 public static void Insert(string key, object obj, int seconds, CacheItemPriority priority) 60 { 61 Insert(key, obj, null, seconds, priority); 62 } 63 64 public static void Insert(string key, object obj, CacheDependency dep, int seconds) 65 { 66 Insert(key, obj, dep, seconds, CacheItemPriority.Normal); 67 } 68 69 public static void Insert(string key, object obj, CacheDependency dep, int seconds, CacheItemPriority priority) 70 { 71 if (obj != null) 72 { 73 _cache.Insert(key, obj, dep, DateTime.Now.AddSeconds((double) (Factor*seconds)), TimeSpan.Zero, priority, null); 74 } 75 } 76 77 public static void Max(string key, object obj) 78 { 79 Max(key, obj, null); 80 } 81 82 public static void Max(string key, object obj, CacheDependency dep) 83 { 84 if (obj != null) 85 { 86 _cache.Insert(key, obj, dep, DateTime.MaxValue, TimeSpan.Zero, CacheItemPriority.AboveNormal, null); 87 } 88 } 89 90 public static void MicroInsert(string key, object obj, int secondFactor) 91 { 92 if (obj != null) 93 { 94 _cache.Insert(key, obj, null, DateTime.Now.AddSeconds((double) (Factor*secondFactor)), TimeSpan.Zero); 95 } 96 } 97 98 public static void Remove(string key) 99 { 100 _cache.Remove(key); 101 } 102 103 public static void RemoveByPattern(string pattern) 104 { 105 IDictionaryEnumerator enumerator = _cache.GetEnumerator(); 106 Regex regex1 = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase); 107 while (enumerator.MoveNext()) 108 { 109 if (regex1.IsMatch(enumerator.Key.ToString())) 110 { 111 _cache.Remove(enumerator.Key.ToString()); 112 } 113 } 114 } 115 116 public static void ReSetFactor(int cacheFactor) 117 { 118 Factor = cacheFactor; 119 } 120 121 122 123 } 124} |
其實(shí)該類主要就是利用前文所提及的關(guān)于Cache依賴項(xiàng)的第一點(diǎn)與第二點(diǎn)的特性來(lái)維護(hù)我們自己的Cache項(xiàng)。
有了SiteCache類,接下來(lái)看看如何使用它。還是以讀取新聞TonN列表為例:
以下為引用的內(nèi)容: 1public static RecordSet GetNewsSetTopN(string classCode,int topN,SortPostsBy orderBy, SortOrder sortOrder, string language) 2{ 3 string cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}:OB:{3}:SO:{4}", language,classCode,topN.ToString(), orderBy.ToString(),sortOrder.ToString()); 4 5 //從上下文中讀緩存項(xiàng) 6 RecordSet newsSet = HttpContext.Current.Items[cacheKey] as RecordSet; 7 if (newsSet == null) 8 { 9 //從HttpRuntime.Cache讀緩存項(xiàng) 10 newsSet = SiteCache.Get(cacheKey) as RecordSet; 11 if (newsSet == null) 12 { 13 //直接從數(shù)據(jù)庫(kù)從讀取 14 CommonDataProvider dp=CommonDataProvider.Instance(); 15 newsSet =dp.GetNewsSetTopN(language,classCode,topN,orderBy,sortOrder); 16 //并將結(jié)果緩存到HttpRuntime.Cache中 17 SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal); 18 } 19 20 } 21return newsSet; 22} |
這樣在5分鐘內(nèi)就不用重復(fù)訪問(wèn)數(shù)據(jù)庫(kù)了來(lái)讀該列表了,當(dāng)然,也有人會(huì)問(wèn),如果在這5分鐘內(nèi)某條新聞刪除了或修改了怎么辦,沒(méi)關(guān)系,我們?cè)趧h除或修改時(shí)可以根據(jù)Cache KEY來(lái)強(qiáng)制刪除該Cache項(xiàng),當(dāng)然,如果你覺(jué)得你對(duì)列表的時(shí)效性不是特別在意,你可以不強(qiáng)制刪除該Cache項(xiàng),讓Cache項(xiàng)定義的時(shí)間點(diǎn)自動(dòng)失效。當(dāng)然,最好還是提供一個(gè)方法按匹配模式項(xiàng)來(lái)強(qiáng)行刪除Cache項(xiàng)就可以了,例如:
以下為引用的內(nèi)容: 1/**//// <summary> 2/// 刪除匹配的NewsSetTopN列表的Cache項(xiàng) 3/// </summary> 4public static void ClearNewsSetTopNCache(string language,string classCode,int topN) 5{ 6 string cacheKey = string.Format("NewsSetTopN-LG:{0}:CC:{1}:TN:{2}",language,classCode,topN.ToString()); 7 SiteCache.RemoveByPattern(cacheKey); 8} 9 |
發(fā)布新聞后調(diào)用靜態(tài)方法ClearNewsSetTopNCache()強(qiáng)行清除原來(lái)的TopN緩存項(xiàng),例如:
以下為引用的內(nèi)容: 1/**//// <summary> 2/// 發(fā)布(新建)新聞 3/// </summary> 4/// <param name="post">新聞實(shí)例</param> 5/// <returns>返回狀態(tài)</returns> 6public static int Create(News post) 7{ 8 int status; 9 CommonDataProvider dp=CommonDataProvider.Instance(); 10 dp.CreateUpdateDeleteNews(post, DataAction.Create, out status); 11 //強(qiáng)制清除匹配的緩存項(xiàng) 12 ClearNewsSetTopNCache (post.Language, post.ClassCode,Globals.GetSiteSetting.NewsListTopN); 13 return status; 14} |
That's all.若有不妥之處還望各位同行指正。
分享:ASP.NET中實(shí)現(xiàn)模板頁(yè)使用過(guò)JavaStruts程序員應(yīng)該知道,Struts中有一個(gè)模板標(biāo)記,雖然其使用起來(lái)比較復(fù)雜,但對(duì)于有大量頁(yè)面的程序來(lái)說(shuō)其帶來(lái)了很多方便。但是,在ASP.NET中并沒(méi)有現(xiàn)成實(shí)現(xiàn)可用,這方面國(guó)內(nèi)討論的也
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- 談ASP.NET 2.0中XML數(shù)據(jù)的處理
- 談?wù)凥tmlControl與WebControl的區(qū)別與用途
- 解析VC.NET擴(kuò)展Windows磁盤清理工具的功能
- 基于Unity容器中的對(duì)象生存期管理分析
- asp.net CheckBoxList各項(xiàng)最小寬度CSS樣式(兼容性good)
- 對(duì)比JAVA和.NET兩個(gè)平臺(tái)的安全功能
- 講解asp.net的異常處理機(jī)制
- ASP.NET 2.0控件異步回調(diào)
- 解讀ASP.NET網(wǎng)站程序防SQL注入式攻擊方法
- ASP.NET 2.0,無(wú)刷新頁(yè)面新境界
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-小議優(yōu)化ASP.NET應(yīng)用性能之Cache篇。