结合高性能web站点构架话题在asp.net中petshop缓存的探究

缓存的方式在计算机中的价值是举重若轻的,没有缓存技术,就会产生若干不可计数的重复操作,以至于拖慢计算机处理速度,这些不必要的重复工作也正是我们人类发展中所需要去除的,需要以机械化的手段进行替代的。

根本上讲就是把不同步的速度,进行合理的分配使之协调高效工作,达到一个最优调配,实例就是cpu、高速缓存、内存、disk之间的处理方式。

在高性能的web站点构中,缓存的方式同样这样,是减少不必要,而提高效率和速度的实践法则。

对于开发来讲,不考虑传输的缓存搭建,也就是在web server处理端和浏览器客户端的缓存机制,针对目前asp.net开发实现,首先主要探究一下asp.net缓存实现方式,针对petshop4案例进行学习。

对于.Net Framework 2.0,AggregateCacheDependency这个类是实现缓存的关键,它负责监视依赖项对象的集合。当这个集合中的任意一个依赖项对象发生改变时,该依赖项对象对应的缓存对象都将被自动移除。数组中的对象可以是 CacheDependency 对象、SqlCacheDependency 对象、从 CacheDependency 派生的自定义对象或这些对象的任意组合。

其关注点就是其可以进行结合对象的监视,此功能可节省主动监视的处理。只需要:

protected AggregateCacheDependency dependency = new AggregateCacheDependency();

dependency.Add(new SqlCacheDependency(dbName, tableName));

针对缓存首先找到缓存的内容,包括应用程序的缓存和page页的缓存,这里主要关注后者,在default.aspx页面引入一个UserControl——PetShopControl:NavigationControl,该控件是Categories数据的bind,并使用了<%@ OutputCache Duration="100000" VaryByParam="*" %>进行页面的缓存。在其后台Page_Load中:

// Add cache dependency

this.CachePolicy.Dependency = DependencyFacade.GetCategoryDependency();

首先看DependencyFacade类:

Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。从解释中了解一下该类所代表的意义:其实际上只是对多个相同性质或者相似功能的一个界面化的封装,这里即时三个方法其中关键实现依次为:

public static AggregateCacheDependency GetCategoryDependency()

{

...

return DependencyAccess.CreateCategoryDependency().GetDependency();

}

return DependencyAccess.CreateProductDependency().GetDependency();

return DependencyAccess.CreateItemDependency().GetDependency();

由此可见一斑,谓此facade仅仅只是外观。

据此到DependencyAccess类,首先名称上来看,简单工厂下的开发,access在factory的代名词可谓官方语言。具体看LoadInstance方法:

private static IPetShopCacheDependency LoadInstance(string className)

{

...

return (IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);

}

就是通常意义的反射。

上面的facade和access,也就是对应的两种模式的对比,主要可以观察到区分点在返回值前者是:AggregateCacheDependency 后者是

IPetShopCacheDependency

/// This is the interface that the DependencyFactory (Factory Pattern) returns.
/// Developers could implement this interface to add different types of Cache Dependency to Pet Shop.

对于工厂模式,只是去instance实例,这是单纯而一致的,如果把access的返回值直接给成AggregateCacheDependency ,省却了facade,但是工厂就不是统一产品生成的车间,而是AggregateCacheDependency 的专属车间,失去工厂的意义。

IPetShopCacheDependency 是一个接口服务于different types of Cache Dependency,具体就是Category、Product、Item三个需要缓存,观察的数据对象。

TableCacheDependency为什么产生?其就是在OO,This is the base class for SQL2KCacheDependency implementation,在Category、Product、Item三者,encapsulates common algorithm to retrieve database and table names from configuration file,就是因为相同算法的抽象,无需要在三个子类中重复实现。

而他们的核心都在于:dependency.Add(new SqlCacheDependency(dbName, tableName));建立数据库/表cache。

在数据库层面是对Category、Product、Item三个表建立INSERT, UPDATE, DELETE触发器,调用AspNet_SqlCacheUpdateChangeIdStoredProcedure存储过程:

SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
CREATE PROCEDURE dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure
             @tableName NVARCHAR(450)
         AS

         BEGIN
             UPDATE dbo.AspNet_SqlCacheTablesForChangeNotification WITH (ROWLOCK) SET changeId = changeId + 1
             WHERE tableName = @tableName
         END
   
GO

更新AspNet_SqlCacheTablesForChangeNotificationchangeId 值。表结构:

tableName    nvarchar(450)
notificationCreated    datetime
changeId    int

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值