日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

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

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

推薦:在ASP.Net 2.0中實現(xiàn)多語言界面的方法
1、跟以前一樣做界面,只是注意,把所有需要有多語言界面的文字都用label來做 2、做完以后,在Solution Explorer里選中這個文件,選Tools->Generate Local Resource 3、你會發(fā)現(xiàn)生成了一

雖然現(xiàn)在已經(jīng)是寬帶時代,小貓已經(jīng)離我們漸漸遠去,可作為WEB應用開發(fā)者來說,我們?nèi)匀挥胸熑魏土x務不斷地通過技術(shù)手段來優(yōu)化WEB應用性能,讓用戶瀏覽時少一些等待,多一些爽快。

所幸的是,ASP.NET作為基于.Net Framework的WEB開發(fā)技術(shù),它也享用著.Net Framework的優(yōu)越性,.Net Framework為我們提供了良好的Cache技術(shù),使我們能開發(fā)出速度更快、用戶體驗更好的WEB應用。命名空間System.Web.Caching提供了Cache類,其Cache的有效性依賴分以下三種情況:

1、時間點(指定時間點內(nèi)有效);

2、KEY值(KEY值作Cache項標識);

3、文件或目錄(指定文件或目錄變更,則原Cache項不可用);


下面我就結(jié)合實際開發(fā)的應用跟大家分享一下使用Cache來提高ASP.NET應用的性能。

我們在開發(fā)中常常會遇到讀取記錄列表(例如最近更新的新聞列表Top N)、記錄本身(例如一條新聞),用戶訪問的時候,這樣的信息是否每次都要重復從數(shù)據(jù)庫中讀取呢?聰明的你可能知道,這完全是沒必要的。

我們?yōu)榱朔奖闾幚�,不防設計一個SiteCache類(借鑒了CS中的CSCache.cs),并提供若干靜態(tài)方法,來負責處理Cache項的添加和刪除。

代碼:

以下為引用的內(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}

其實該類主要就是利用前文所提及的關于Cache依賴項的第一點與第二點的特性來維護我們自己的Cache項。

有了SiteCache類,接下來看看如何使用它。還是以讀取新聞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 //從上下文中讀緩存項
6 RecordSet newsSet = HttpContext.Current.Items[cacheKey] as RecordSet;
7 if (newsSet == null)
8 {
9 //從HttpRuntime.Cache讀緩存項
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)就不用重復訪問數(shù)據(jù)庫了來讀該列表了,當然,也有人會問,如果在這5分鐘內(nèi)某條新聞刪除了或修改了怎么辦,沒關系,我們在刪除或修改時可以根據(jù)Cache KEY來強制刪除該Cache項,當然,如果你覺得你對列表的時效性不是特別在意,你可以不強制刪除該Cache項,讓Cache項定義的時間點自動失效。當然,最好還是提供一個方法按匹配模式項來強行刪除Cache項就可以了,例如:

以下為引用的內(nèi)容:
1/**//// <summary>
2/// 刪除匹配的NewsSetTopN列表的Cache項
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()強行清除原來的TopN緩存項,例如:

以下為引用的內(nèi)容: 1/**//// <summary>
2/// 發(fā)布(新建)新聞
3/// </summary>
4/// <param name="post">新聞實例</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 //強制清除匹配的緩存項
12 ClearNewsSetTopNCache (post.Language, post.ClassCode,Globals.GetSiteSetting.NewsListTopN);
13 return status;
14}

That's all.若有不妥之處還望各位同行指正。

分享:ASP.NET中實現(xiàn)模板頁
使用過JavaStruts程序員應該知道,Struts中有一個模板標記,雖然其使用起來比較復雜,但對于有大量頁面的程序來說其帶來了很多方便。但是,在ASP.NET中并沒有現(xiàn)成實現(xiàn)可用,這方面國內(nèi)討論的也

來源:模板無憂//所屬分類:.Net教程/更新時間:2008-08-22
相關.Net教程