cache用法Word文件下载.docx
《cache用法Word文件下载.docx》由会员分享,可在线阅读,更多相关《cache用法Word文件下载.docx(32页珍藏版)》请在冰豆网上搜索。
由于这种动态页面技术通常需要从数据源获取数据,并经过一些计算逻辑,最终变成一些
HTML代码发给客户端显示。
而这些计算过程显然也是有成本的。
这些处理成本最直接可表现
为影响服务器的响应速度,尤其是当数据的处理过程变得复杂以及访问量变大时,会变得比较明显。
另一方面,有些数据并非时刻在发生变化,如果我们可以将一些变化不频繁的数据的最
终计算结果(包括页面输岀)缓存起来,就可以非常明显地提升程序的性能,缓存的最常见且
最重要的用途就体现在这个方面。
这也是为什么一说到性能优化时,一般都将缓存摆在第一位
的原因。
我今天要说到的ASP.NETCache也是可以实现这种缓存的一种技术。
不过,它还
有其它的一些功能,有些是其它缓存技术所没有的。
在介绍Cache的用法前,我们先来看一下Cache的定义:
(说明:
我忽略了一些意义不大的
成员)I■-'
I:
'
//实现用于Web应用程序的缓存。
无法继承此类。
publicsealedclass
Cache:
IEnumerable
//用于Cache.Insert(...)
项从不过期。
publicstaticreadonly
//用作Cache.Insert(...)
//方法调用中的
方法调用中的absoluteExpiration
DateTimeNoAbsoluteExpiration;
或Cache.Add(...)
slidingExpiration参数,以禁用可调过期。
TimeSpanNoSlidingExpiration;
参数中以指示
//获取或设置指定键处的缓存项。
publicobjectthis
[stringkey]{
get;
set;
}
//将指定项添加到对象,该对象具有依赖项、过期和优先级策略
//以及一个委托(可用于在从Cache移除插入项时通知应用程序)
publicobjectdependencies,
slidingExpiration.
CacheDependency
TimeSpan
Add(stringkey,objectvalue,
DateTimeabsoluteExpiration,
CacheItemPrioritypriority,
CacheltemRemovedCallbackonRemoveCallback);
//从对象检索指定项。
//key:
要检索的缓存项的标识符。
//返回结果:
检索到的缓存项,未找到该键时为null
publicobject
Get(
string
key);
publicvoid
Insert(
string
key,
object
value);
value,
dependencies);
dependencies,
DateTimeabsoluteExpiration,TimeSpan
slidingExpiration);
//摘要:
//向对象中插入对象,后者具有依赖项、过期和优先级策略
//以及一个委托(可用于在从Cache移除插入项时通知应用程序)。
//
//参数:
//用于引用该对象的缓存键。
//value:
//要插入缓存中的对象。
//dependencies:
//该项的文件依赖项或缓存键依赖项。
当任何依赖项更改时,该对象即无效,
//并从缓存中移除。
如果没有依赖项,则此参数包含null。
//absoluteExpiration:
//所插入对象将过期并被从缓存中移除的时间。
//如果使用绝对过期,则slidingExpiration参数必须为
Cache.NoSlidingExpiration。
//slidingExpiration:
//最后一次访问所插入对象时与该对象过期时之间的时间间隔。
如果该值等效于20
分钟,
//则对象在最后一次被访问20分钟之后将过期并被从缓存中移除。
如果使用可
调过期,则
//absoluteExpiration参数必须为
//priority:
//该对象相对于缓存中存储的其他项的成本,由枚举表示。
//该值由缓存在退岀对象时使用;
具有较低成本的对象在具有较高成本的对象之
前被从缓存移除。
//onRemoveCallback:
//在从缓存中移除对象时将调用的委托(如果提供)。
//当从缓存中删除应用程序的对象时,可使用它来通知应用程序。
//异常:
//System.ArgumentException:
//为要添加到Cache中的项设置absoluteExpiration和
slidingExpiration参数。
//System.ArgumentNullException:
//key或value参数为null。
//System.ArgumentOutOfRangeException:
//将slidingExpiration参数设置为小于TimeSpan.Zero或大于一年的等
效值。
Insert(stringkey,objectvalue,
slidingExpiration,
CacheItemRemovedCallbackonRemoveCallback);
//从应用程序的
对象移除指定项。
Remove(stringkey);
//将对象与依赖项策略、到期策略和优先级策略
//以及可用来在从缓存中移除项【之前】通知应用程序的委托一起插入到Cache
对象
中。
//注意:
此方法受以下版本支持:
3.5SP1、3.0SP1、2.0SP1
publicvoidInsert(stringkey,objectvalue,CacheDependency
CacheItemUpdateCallbackonUpdateCallback);
}
ASP.NET为了方便我们访问Cache,在HttpRuntime类中加了一个静态属性Cache,这
样,我们就可以在任意地方使用Cache的功能。
而且,ASP.NET还给它增加了二个快捷方
式”:
Page.Cache,HttpContext.Cache,我们通过这二个对象也可以访问到
HttpRuntime.Cache
HttpContext.Cache
,注意:
这二者是在访冋冋一个对象。
Page.Cache访冋了
,而HttpContext.Cache又直接访问HttpRuntime.Cache
通常,我们使用Cache时,一般只有二个操作:
读,写。
要从Cache中获取一个缓存项,我们可以调用Cache.Get(key)方法,要将一个对象放入缓
存,我们可以调用Add,Insert方法。
然而,Add,Insert方法都有许多参数,有时我们
或许只是想简单地放入缓存,一切接受默认值,那么还可以调用它的默认索引器,我们来看
下这个索引器是如何工作的:
[stringkey]
{
get
returnthis
.Get(key);
set
this.Insert(key,value);
可以看到:
读缓存,其实是在调用Get方法,而写缓存则是在调用Insert方法的最简单的那
个重载版本。
注意了:
Add方法也可以将一个对象放入缓存,这个方法有7个参数,而Insert也有一个签
名类似的重载版本,它们有着类似的功能:
将指定项添加到对象,该对象具有依赖项、过
期和优先级策略以及一个委托(可用于在从Cache移除插入项时通知应用程序)。
然而,
它们有一点小的区别:
当要加入的缓存项已经在Cache中存在时,Insert将会覆盖原有的缓
存项目,而Add则不会修改原有缓存项。
也就是说:
如果您希望某个缓存项目一旦放入缓存后,就不要再被修改,那么调用Add确实可
以防止后来的修改操作。
而调用Insert方法,则永远会覆盖已存在项(哪怕以前是调用
Add加入的)。
从另一个角度看,Add的效果更像是staticreadonly的行为,而Insert的效果则像
static的行为。
注意:
我只是说【像】,事实上它们比一般的static成员有着更灵活的用法。
由于缓存项可以让我们随时访问,看起来确实有点static成员的味道,但它们有着更高级的
特性,比如:
缓存过期(绝对过期,滑动过期),缓存依赖(依赖文件,依赖其它缓存项),
移除优先级,缓存移除前后的通知等等。
后面我将会分别介绍这四大类特性。
Cache类有一个很难得的优点,用MSDN上的说话就是:
此类型是线程安全的
为什么这是个难得的优点呢?
因为在.net中,绝大多数类在实现时,都只是保证静态类型的
方法是线程安全,而不考虑