国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-18 17:05:07
字體:
供稿:網(wǎng)友

      雖然現(xiàn)在已經(jīng)是寬帶時(shí)代,小貓已經(jīng)離我們漸漸遠(yuǎn)去,可作為WEB應(yīng)用開發(fā)者來說,我們?nèi)匀挥胸?zé)任和義務(wù)不斷地通過技術(shù)手段來優(yōu)化WEB應(yīng)用性能,讓用戶瀏覽時(shí)少一些等待,多一些爽快。
       所幸的是,asp.net作為基于.Net Framework的WEB開發(fā)技術(shù),它也享用著.Net Framework的優(yōu)越性,.Net Framework為我們提供了良好的Cache技術(shù),使我們能開發(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í)際開發(fā)的應(yīng)用跟大家分享一下使用Cache來提高ASP.NET應(yīng)用的性能。
       我們?cè)陂_發(fā)中常常會(huì)遇到讀取記錄列表(例如最近更新的新聞列表Top N)、記錄本身(例如一條新聞),用戶訪問的時(shí)候,這樣的信息是否每次都要重復(fù)從數(shù)據(jù)庫中讀取呢?聰明的你可能知道,這完全是沒必要的。

我們?yōu)榱朔奖闾幚恚环涝O(shè)計(jì)一個(gè)SiteCache類(借鑒了CS中的CSCache.cs),并提供若干靜態(tài)方法,來負(fù)責(zé)處理Cache項(xiàng)的添加和刪除。

代碼:


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)的特性來維護(hù)我們自己的Cache項(xiàng)。
有了SiteCache類,接下來看看如何使用它。還是以讀取新聞TonN列表為例:


 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ù)庫從讀取
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ù)訪問數(shù)據(jù)庫了來讀該列表了,當(dāng)然,也有人會(huì)問,如果在這5分鐘內(nèi)某條新聞刪除了或修改了怎么辦,沒關(guān)系,我們?cè)趧h除或修改時(shí)可以根據(jù)Cache KEY來強(qiáng)制刪除該Cache項(xiàng),當(dāng)然,如果你覺得你對(duì)列表的時(shí)效性不是特別在意,你可以不強(qiáng)制刪除該Cache項(xiàng),讓Cache項(xiàng)定義的時(shí)間點(diǎn)自動(dòng)失效。當(dāng)然,最好還是提供一個(gè)方法按匹配模式項(xiàng)來強(qiáng)行刪除Cache項(xiàng)就可以了,例如:

 

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)行清除原來的TopN緩存項(xiàng),例如:

 

 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.若有不妥之處還望各位同行指正。

http://www.survivalescaperooms.com/aspsir/archive/2006/07/27/461229.html


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 台湾省| 鲁山县| 台前县| 玛沁县| 延津县| 双流县| 绵竹市| 遂宁市| 广安市| 汽车| 丘北县| 盈江县| 巴东县| 秭归县| 水城县| 云南省| 雷波县| 玉山县| 沈丘县| 福建省| 泰顺县| 新平| 自贡市| 海伦市| 贵阳市| 轮台县| 嘉禾县| 水城县| 湄潭县| 米易县| 福贡县| 萨嘎县| 碌曲县| 察哈| 云和县| 乌兰察布市| 民县| 南皮县| 蕲春县| 讷河市| 当阳市|