- ·上一篇文章:IFRAME跨域名的解决方法,终结版(小张.NET原创)
- ·下一篇文章:ASP.NET的错误处理机制
小议优化ASP.NET应用性能之Cache篇
虽然现在已经是宽带时代,小猫已经离我们渐渐远去,可作为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项的添加和删除。
代码:
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列表为例:
1public static RecordSet GetNewsSetTopN(string classCode,int topN,SortPostsBy orderBy, SortOrder sortOrder, string language)
2{
3 s
所幸的是,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项的添加和删除。
代码:
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列表为例:
1public static RecordSet GetNewsSetTopN(string classCode,int topN,SortPostsBy orderBy, SortOrder sortOrder, string language)
2{
3 s
