随笔-37  评论-592  文章-0  trackbacks-14

       虽然现在已经是宽带时代,小猫已经离我们渐渐远去,可作为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.PNG
代码:

SiteCache.cs


       其实该类主要就是利用前文所提及的关于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.若有不妥之处还望各位同行指正。

下一篇预告--小议优化ASP.NET应用性能之ViewState篇

posted on 2006-07-27 17:00 恩电 阅读(3573) 评论(11)  编辑 收藏 网摘 所属分类: ASP.NET开发

评论:
#1楼 2006-07-28 01:02 | dazhou[未注册用户]
服务器内存足够大的情况下。这样做很好。

否则,用了比不用慢。

  回复  引用    
#2楼 2006-07-28 05:50 | DG-10液位显示报警器[未注册用户]
内存至关重要
  回复  引用    
#3楼 2006-07-28 08:16 | 路过[未注册用户]
服务器多大的内在才足够大?4G?
  回复  引用    
#4楼[楼主] 2006-07-28 09:04 | 恩电      
现在的服务器内存配置都是以G为单位,再说了你可以根据你内存的实际大小以及信息的实效性强度来调节各缓存项的Factor值,就拿我们自己的服务器来说2G的内存,两个平台(dg3g.com与acafa.com)经过长期运行并没有象 dazhou所说的“用了比不用慢”!
  回复  引用  查看    
#5楼 2006-07-28 10:45 | yzx110
Cache必须用的适当,没出问题是好事,但是必须知道Cache不是可以用得的毫无顾忌
  回复  引用    
#6楼 2006-07-28 13:24 | onekey      
楼主的观点很不错,但是要注意CACHE容易丢失,要控制的好
  回复  引用  查看    
#7楼 2006-07-31 14:40 | メ冰枫ぱ雪      
看来程序得改了,我还把 一些 Top 扔在 ViewState 里哈,真是可笑。。 马上改。。 缓存学了都没用了。。
  回复  引用  查看    
#8楼 2006-10-12 12:13 | 海之心      
终于看到了熟悉的东东!
  回复  引用  查看    
#9楼 2006-11-13 10:39 | 小鬼[匿名][未注册用户]
这样用Cache好像不是太好.

最好使用SqlCacheDependency来处理数据过期问题.

  回复  引用    
#10楼 2007-02-04 06:58 | Jeffrey Zhao      
要设计和实现一个好的Cache机制不是个容易的事情。
  回复  引用  查看    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 461229




相关文章:

相关链接: