`

PetShop 4.0的缓存处理

阅读更多

在访问量非常大,但更新较少的网站中使用缓存,可以大大提高程序运行的效率,给网络用户一个良好的体验效果。在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中缓存的相关处理类

    简化版的PetShop4.0缓存相关处理类,下载后把所有类文件导入的一个新的类库项目中,注意更改命名空间,然后建立想要监视的数据库表的类 继承自TableCache类,调用父类构造方法传送表名称

    petshop4.0 详解之四(PetShop之ASP.NET缓存) .doc

    petshop4.0 详解之四(PetShop之ASP.NET缓存) .doc

    PetShop4.0源码 详细的解析资料 两种同步和基于MSMQ的异步处理 缓存处理策略 Master Pages Wizard Control

    微软提供PetShop4.0,最佳的ASP.NET学习资料。附上了详细的解析。 功能介绍: 1.System.Transactions替代了服务组件。System.Transactions是.NET Framework 2.0下出现的一个事务控制的命名空间,它是处理替代COM+...

    petshop 4详解

    非原创) petshop4.0 详解之一(系统架构设计 petshop4.0 详解之二(数据访问层之数据库访问设计 petshop4.0 详解之三(PetShop数据访问层之消息处理) petshop4.0 详解之四(PetShop之ASP.NET缓存) ...

    王福朋petshop4.0视频教程必备知识源代码(没有数据库)

    王福朋petshop4.0系列视频教程中,在讲解petshop之前,先用几节课讲解了关于接口和工厂,缓存机制和membership的基础知识,以便更好的理解petshop。 这里把源代码提供给大家,但是没有数据库,具体的操作还需要大家...

    实例PetShop4.0(ASP.NET)

    微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊,大家...同时,在事务、数据缓存、安全方面使用了.NET 2.0附带的特性,构建了一个灵活的最佳实践的应用程序。

    PetShop4.0 详解(doc)

    详解架构 用户控件 数据库 存储过程 缓存设置等

    宠物商店V4.0版源码 (PetShop V4.0)

    目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0...

    Petshop4.0详解

    Petshop4.0是microsoft基于.NET Framework 2.0开发的一个示例程序,本书中对系统所采用的架构设计、设计模式、缓存技术以及ASP.NET 2.0中提供的Membership,Profile技术做出了详细的解释,是学习.NET编程和架构设计...

    petshop(宠物商店) V4.0源码文件

    可以说,学习PetShop 4.0是深入掌握ASP.NET 2.0技术的捷径。 大名鼎鼎的PetShop(宠物商店)V4.0 1.System.Transactions替代了服务组件。... 2.... 3.... 4.... 5.使用了ASP.NET2.0中的...使用SqlCacheDependency缓存处理策略

    宠物商店V4.0版源码

    目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0...

    宠物商店 v4.0 源码.rar

    目前,PetShop已经从最初的2.0、3.0等版本,发展到了最新的4.0版本。PetShop 4.0使用ASP.NET 2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop 4.0...

    为SQL缓存通知启用数据库

    最近在学习.NET缓存的过程中,研读了PetShop4.0的代码,对其中的SqlCacheDependency特性做了一下代码测试。对测试数据表对应的缓存实施SQL Cache Invalidation。当对应的数据表发生变动时,可以将相关项从缓存中移除...

    《解剖PetShop》之四:PetShop之ASP.NET缓存

    本文主要讲解PetShop4.0的ASP.NET缓存,极大的提高的网站的性能,需要的朋友可以参考下。

    Microsoft PetShop资料汇总.chm

    PetShop 4 的系统架构设计 || PetShop 4 数据访问层之数据库访问设计 ||PetShop 4 数据访问层之消息处理 || PetShop 4 之ASP.NET缓存 ||PetShop 4 之业务逻辑层设计||PetShop 4 之表示层设计 || 架构经验小结

    宠物商店 v4.0

    PetShop4.0使用ASP.NET2.0技术开发,其中加入了众多新增特性,因此,在性能、代码数量、可扩展性等方面有了重大改善。可以说,学习PetShop4.0是深入掌握ASP.NET2.0技术的捷径。本节将引领读者逐步了解PetShop4.0的...

    pet shop 4.0 有详细架构文档 代码 三层解析

    《解剖PetShop》系列之三 PetShop数据访问层之消息处理 14 《解剖PetShop》系列之四 PetShop之ASP.NET缓存 22 《解剖PetShop》系列之五 PetShop之业务逻辑层设计 35 《解剖PetShop》系列之六 PetShop之表示层设计 44

    Pet Shop 4.0 架构与技术分析PPT

    Pet Shop 4.0 架构与技术分析PPT 微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊,大家都知道,一直以来,在.NET和Java之间争论不休,到底使用哪个平台...

    ASP.NET 3.5宝典

    第3部分通过实际的项目应用PetShop 4.0,介绍了如何在具体开发中使用ASP.NET的这些技术,以及ASP.NET的客户端异步调用技术ASP.NET AJAX。  本书的3个部分适合不同层次的读者,需要入门的读者可以通过第1部分,了解...

    Microsoft .NET Pet Shop 4.0

    微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊,大家...同时,在事务、数据缓存、安全方面使用了.NET 2.0附带的特性,构建了一个灵活的最佳实践的应用程序。

Global site tag (gtag.js) - Google Analytics