小議優(yōu)化ASP.NET應(yīng)用性能之Cache篇_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

      推薦:在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)討論的也

      來(lái)源:模板無(wú)憂//所屬分類:.Net教程/更新時(shí)間:2008-08-22
      相關(guān).Net教程