在访问量非常大,但更新较少的网站中使用缓存,可以大大提高程序运行的效率,给网络用户一个良好的体验效果。在Microsoft提供的经典示例项目.Net PetShop 4.0中,也提供了对缓存的支持,本文是作者在学习此项目时的一些心得体会,有一些地方还不十分清楚,希望能够抛砖引玉。
在.Net PetShop 4.0中,非常成功地使用了工厂模式以及接口(interface)、静态类(Static class)、抽象类(abstract class)等成员。在使用缓存时,也是通过web.config配置进行设置,在使用时非常灵活。下面从底向上具体分析.Net PetShop 4.0缓存方面的技术。
首先看一下该项目中与缓存直接相关的命名空间:
PetShop.ICacheDependency
PetShop.TableCacheDependency
PetShop.CacheDependencyFactory
PetShop.Web
一、PetShop.ICacheDependency命名空间
最低层应该是接口的定义了,在PetShop.ICacheDependency命名空间中只定义了一个接口IPetShopCacheDependency,该接口只有一个方法 GetDependency,没有任何参数,返回AggregateCacheDependency类型。AggregateCacheDependency是在.NET Framework 2.0 版中是新增的类,组合 ASP.NET 应用程序的 Cache 对象中存储的项和 CacheDependency 对象的数组之间的多个依赖项(MSDN中原话)。
二、PetShop.TableCacheDependency命名空间
在PetShop.TableCacheDependency命名空间中,提供两种类:抽象类TableDependency和它的继承类Category、Item和Product。抽象类TableDependency的构造函数为:
protectedTableDependency(stringconfigKey){
stringdbName=ConfigurationManager.AppSettings["CacheDatabaseName"];
stringtableConfig=ConfigurationManager.AppSettings[configKey];
string[]tables=tableConfig.Split(configurationSeparator);
foreach(stringtableNameintables)
dependency.Add(newSqlCacheDependency(dbName,tableName));
}
传递了一个参数configKey,根据该参数从web.config文件中获取表名列表,同时在web.config中获取数据库名称。将表名列表中的所有数据表添加到AggregateCacheDependency类型的dependency变量中。在此外使用了.NET Framework 2.0 版中是新增的另一个与缓存有关的SqlCacheDependency类。这个类用于建立ASP.NET应用程序的Cache对象中存储的项和特定SQL Server数据库表之间的联系。AggregateCacheDependency和SqlCacheDependency都从CacheDependency继承而来,但在.NET 2.0中还未提供Oracle等其它数据库对应的类。
下面是web.config文件中与缓存相关的设置:
<!--Cachedependencyoptions.Possiblevalues:PetShop.TableCacheDependencyforSQLServerandkeepemptyforORACLE-->
<addkey="CacheDependencyAssembly"value="PetShop.TableCacheDependency"/>
<!--CacheDatabaseNameshouldmatchthenameundercachingsection,whenusingTableCacheDependency-->
<addkey="CacheDatabaseName"value="MSPetShop4"/>
<!--*TableDependencyliststabledependencyforeachinstanceseparatedbycomma-->
<addkey="CategoryTableDependency"value="Category"/>
<addkey="ProductTableDependency"value="Product,Category"/>
<addkey="ItemTableDependency"value="Product,Category,Item"/>
每个继承类都只有一个构造函数,通过设置基类的configKey参数变成了三个不同的类。Product类的构造函数为:
publicProduct():base("ProductTableDependency"){}
三、PetShop.CacheDependencyFactory命名空间
在PetShop.CacheDependencyFactory命名空间中有两个类,分别是DependencyAccess和DependencyFacade。如果了解微软以前提供的一些经典例子的分层,便不难理解这两个类的命名以及它们对应的层次级别。这两个类都是静态类,DependencyAccess类里面的方法都是返回IPetShopCacheDependency,而DependencyFacade里面的方法都是返回AggregateCacheDependency。
DependencyAccess类里面关键的一个方法是LoadInstance,它是工厂模式的具体实现。其代码如下:
privatestaticIPetShopCacheDependencyLoadInstance(stringclassName){
stringpath=ConfigurationManager.AppSettings["CacheDependencyAssembly"];
stringfullyQualifiedClass=path+"."+className;
//Usingtheevidencegivenintheconfigfileloadtheappropriateassemblyandclass
return(IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
}
在这个方法中通过配置文件中的设置和传进来的参数className,返回相对应的程序集和类。DependencyAccess类里面的其它三个方法,只是调用这个方法,传入不同的参数而已。
DependencyFacade类提供的三个方法正好与DependencyAccess类的三个方法相对应,分别获取Category、Item和Product的AggregateCacheDependency。在DependencyFacade类中还读取了web.config中的CacheDependencyAssembly设置,从而决定是调用DependencyAccess对应的方法,还是直接返回null。
四、PetShop.Web命名空间
在PetShop.Web的App_Code中,有四个静态类与缓存直接相关,分别是CategoryDataProxy、ItemDataProxy、ProductDataProxy和WebUtility。其中前三个分别调用DependencyFacade对应的方法,遗憾的是在哪里(或者说如何)使用这三个类我还没有完全弄清楚。
WebUtility中有两个方法GetCategoryName和GetProductName使用了缓存,下面是GetCategoryName的部分代码:
if(data==null){
//CachingdurationfromWeb.config
intcacheDuration=int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);
//Ifthedataisnotinthecachethenfetchthedatafromthebusinesslogictier
data=category.GetCategory(categoryId).Name;
//CreateaAggregateCacheDependencyobjectfromthefactory
AggregateCacheDependencycd=DependencyFacade.GetCategoryDependency();
//Storetheoutputinthedatacache,andAddthenecessaryAggregateCacheDependencyobject
HttpRuntime.Cache.Add(cacheKey,data,cd,DateTime.Now.AddHours(cacheDuration),Cache.NoSlidingExpiration,CacheItemPriority.High,null);
}
在.Net 2.0中,对缓存的维护有两种方式:第一种是每次使用缓存之间进行判断缓存是否存,如果不存在则读取数据存入缓存;另外一种方式是使用CacheItemRemovedCallback委托来实现,当缓存失效时自动调用委托过程,重新产生缓存。从上面的代码来看,.Net PetShop 4.0使用的是第一种方式。
分享到:
相关推荐
简化版的PetShop4.0缓存相关处理类,下载后把所有类文件导入的一个新的类库项目中,注意更改命名空间,然后建立想要监视的数据库表的类 继承自TableCache类,调用父类构造方法传送表名称
petshop4.0 详解之四(PetShop之ASP.NET缓存) .doc
微软提供PetShop4.0,最佳的ASP.NET学习资料。附上了详细的解析。 功能介绍: 1.System.Transactions替代了服务组件。System.Transactions是.NET Framework 2.0下出现的一个事务控制的命名空间,它是处理替代COM+...
非原创) petshop4.0 详解之一(系统架构设计 petshop4.0 详解之二(数据访问层之数据库访问设计 petshop4.0 详解之三(PetShop数据访问层之消息处理) petshop4.0 详解之四(PetShop之ASP.NET缓存) ...
王福朋petshop4.0系列视频教程中,在讲解petshop之前,先用几节课讲解了关于接口和工厂,缓存机制和membership的基础知识,以便更好的理解petshop。 这里把源代码提供给大家,但是没有数据库,具体的操作还需要大家...
微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊,大家...同时,在事务、数据缓存、安全方面使用了.NET 2.0附带的特性,构建了一个灵活的最佳实践的应用程序。
详解架构 用户控件 数据库 存储过程 缓存设置等
目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0...
Petshop4.0是microsoft基于.NET Framework 2.0开发的一个示例程序,本书中对系统所采用的架构设计、设计模式、缓存技术以及ASP.NET 2.0中提供的Membership,Profile技术做出了详细的解释,是学习.NET编程和架构设计...
可以说,学习PetShop 4.0是深入掌握ASP.NET 2.0技术的捷径。 大名鼎鼎的PetShop(宠物商店)V4.0 1.System.Transactions替代了服务组件。... 2.... 3.... 4.... 5.使用了ASP.NET2.0中的...使用SqlCacheDependency缓存处理策略
目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0...
目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0...
最近在学习.NET缓存的过程中,研读了PetShop4.0的代码,对其中的SqlCacheDependency特性做了一下代码测试。对测试数据表对应的缓存实施SQL Cache Invalidation。当对应的数据表发生变动时,可以将相关项从缓存中移除...
本文主要讲解PetShop4.0的ASP.NET缓存,极大的提高的网站的性能,需要的朋友可以参考下。
PetShop 4 的系统架构设计 || PetShop 4 数据访问层之数据库访问设计 ||PetShop 4 数据访问层之消息处理 || PetShop 4 之ASP.NET缓存 ||PetShop 4 之业务逻辑层设计||PetShop 4 之表示层设计 || 架构经验小结
PetShop4.0使用ASP.NET2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop4.0是深入掌握ASP.NET2.0技术的捷径。本节将引领读者逐步了解PetShop4.0的...
《解剖PetShop》系列之三 PetShop数据访问层之消息处理 14 《解剖PetShop》系列之四 PetShop之ASP.NET缓存 22 《解剖PetShop》系列之五 PetShop之业务逻辑层设计 35 《解剖PetShop》系列之六 PetShop之表示层设计 44
Pet Shop 4.0 架构与技术分析PPT 微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊,大家都知道,一直以来,在.NET和Java之间争论不休,到底使用哪个平台...
第3部分通过实际的项目应用PetShop 4.0,介绍了如何在具体开发中使用ASP.NET的这些技术,以及ASP.NET的客户端异步调用技术ASP.NET AJAX。 本书的3个部分适合不同层次的读者,需要入门的读者可以通过第1部分,了解...
微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊,大家...同时,在事务、数据缓存、安全方面使用了.NET 2.0附带的特性,构建了一个灵活的最佳实践的应用程序。