查看: 5605|回复: 0
打印 上一主题 下一主题

小议优化ASP.NET应用性能之Cache篇

[复制链接]
跳转到指定楼层
1#
发表于 2008-3-12 09:49:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
虽然现在已经是宽带时代,小猫已经离我们渐渐远去,可作为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; Chinaz_com
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            { Www_Chinaz_com
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 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   //直接从数据库从读取
14   CommonDataProvider dp=CommonDataProvider.Instance();
15   newsSet =dp.GetNewsSetTopN(language,classCode,topN,orderBy,sortOrder);
16   //并将结果缓存到HttpRuntime.Cache中
17   SiteCache.Insert(cacheKey, newsSet, 60, CacheItemPriority.Normal);
18  }
19        
20 }
21return newsSet;
22}


这样在5分钟内就不用重复访问数据库了来读该列表了,当然,也有人会问,如果在这5分钟内某条新闻删除了或修改了怎么办,没关系,我们在删除或修改时可以根据Cache KEY来强制删除该Cache项,当然,如果你觉得你对列表的时效性不是特别在意,你可以不强制删除该Cache项,让Cache项定义的时间点自动失效。当然,最好还是提供一个方法按匹配模式项来强行删除Cache项就可以了,例如:

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

发布新闻后调用静态方法ClearNewsSetTopNCache()强行清除原来的TopN缓存项,例如:

以下为引用的内容: 1/**//// <summary>
2/// 发布(新建)新闻
3/// </summary>
4/// <param name="post">新闻实例</param>
5/// <returns>返回状态</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.若有不妥之处还望各位同行指正。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州朗动科技(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:政企网站,系统平台,微信公众号,各类小程序,手机APP客户端,浙里办微应用,浙政钉微应用、主机域名、虚拟空间、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2026 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表