asp.net 的状态管理与cache ----转自博客园

在我的印象中,谈到状态管理,更多的是谈application,session之类的,很少有谈cache的,当然cache不属于状态管理的范围。但是最近在工作中用到了cache,发现实际上Cache比其它的对象更易用,更实用 
还是先把原先经常谈到的对象罗列一次吧 
1.服务器端 
application 
属于全局控制,使用前要lock 
session 
每个用户有自己的一个副本,有过期时间,不过过期时间不好控制 

2.客户端 
cookie 
每个用户都有cookie,过期时间好设置,但有大小限制,一般为4K,浏览器可能不支持或禁用cookie 
viewstate 
每个页面都有viewstate 
hiddlefield 
属于控件,自由控制 

下面来谈cache。一般有三种分类:页面级输出缓存,页片段缓存,数据缓存(cache对象),这里谈的是cache对象。感觉cache,就是让application和cookie来了个综合,在服务器的内存中开辟了一块空间来存放数据,任务人可以访问,且可以灵活的设置过期时间,甚至可以设置过期时所引发的事件。 
cache的用法与其它对象差不多,有add和insert两种方法添加。 
Inser方法可以使用可选参数,即使用默认参数,来实现缓存的添加。 
Add()方法只能添加缓存中没有的项,如果添加缓存中已有的项将失败(但不会抛出异常),而Insert()方法能覆盖原来的项。 
和Application不同,不需要使用在插入缓存的时候进行锁操作,Cache会自己处理并发。 
Cache.Add( 
      KeyName,//缓存名 
       KeyValue,//要缓存的对象 
       Dependencies,//依赖项 
       AbsoluteExpiration,//绝对过期时间 
       SlidingExpiration,//相对过期时间 
       Priority,//优先级 
       CacheItemRemovedCallback);//缓存过期引发事件 

用cache,主要就是要用它的依赖与过期,不然就和application没区别了,依赖有三种: 
文件依赖与其它依赖算一类,要用到CacheDependency对象 
文件依赖: 
CacheDependency fileDepends = new CacheDependency(Server.MapPath("Northwind.xml")); 
Cache.Insert("GridViewDataSet", dsGrid, fileDepends); 
其它依赖: 
string[] cacheDependsArray = {"Depend0", "Depend1", "Depend2"}; 
CacheDependency cacheDepends = new CacheDependency(null, cacheDependsArray); 
Cache.Insert("GridViewDataSet", dsGrid, cacheDepends); 
一起用: 
string[] fileDependsArray = {Server.MapPath("Northwind.xml")}; 
string[] cacheDependsArray = {"Depend0", "Depend1", "Depend2"}; 
CacheDependency cacheDepends = new CacheDependency(fileDependsArray, cacheDependsArray); 
Cache.Insert("GridViewDataSet", dsGrid, cacheDepends); 

还有一种依赖就是过期时间 
过期时间有两个参数:AbsoluteExpiration与SlidingExpiration。 
AbsoluteExpiration可以设置缓存的绝对过期时间,如: 
Cache.Insert("GridViewDataSet ", dsGrid, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration); 
缓存会在添加起30分钟后过期。 
NoSlidingExpiration可以设置相对过期时间,如果缓存在NoSlidingExpiration设定的时间内没有被访问,缓存过期,如果在这段时间内有访问,则缓存过期时间将会重置为原始值,如NoSlidingExpiration=20 
在20分钟内如果没有被访问,缓存过期,如果每次19分钟访问缓存,缓存将永远不会过期。 
Cache.Insert("DataGridDataSet", dsGrid, null,Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(30)); 

有以下几点需要注意: 
1.Cache.NoAbsoluteExpiration是枚举,表示无绝对过期时间 
Cache.NoSlidingExpiration表示无相对过期时间 
2.如果既设置了绝对过期时间又设置了相对过期时间,则参考以下: 
如果 slidingExpiration 参数设置为 NoSlidingExpiration,则禁用可调整过期。如果将 slidingExpiration 参数设置为大于 Zero,则 absoluteExpiration 参数设置为 Now 加 slidingExpiration 参数中包含的值。如果在 absoluteExpiration 参数指定的时间之前从缓存请求该项,该项将再次放入缓存,并且 absoluteExpiration 将再次设置为 DateTime.Now 加 slidingExpiration 参数中包含的值。如果在 absoluteExpiration 参数中的日期以前并未从缓存中请求该项,则从缓存移除该项。 

优先级 
就是当服务器内存资源不足的时候,对缓存区的数据进行如何处理 
NotRemovable: Items with this priority will not be evicted. 
High: Items with this priority level are the least likely to be evicted. 
AboveNormal: Items with this priority level are less likely to be evicted than items assigned Normal priority. 
Default: This is equivalent to Normal. 
Normal: The default value. 
BelowNormal: Items with this priority level are more likely to be evicted than items assigned Normal priority. 
Low: Items with this priority level are the most likely to be evicted. 
虽然是英文,但很好理解,就是设置的越高,越不易被清除。 

缓存失效事件处理 
这需要一个委托:CacheDependency,当然,你直接把方法名写在参数处也可以。 
当缓存失效失效时就会激发这个事件,调用这个方法,这个方法有三个参数: 
string str, object sender, CacheItemRemovedReason reason 
用法: 
public static CacheItemRemovedCallback onCallBack = null; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
        CacheDependency dep = new CacheDependency(null, new string[] { "1", "2" }); 
        onCallBack = CallBack; 
        Cache.Insert("A", "a", null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(5), CacheItemPriority.Default, onCallBack); 
    } 

    private void CallBack(string str, object sender, CacheItemRemovedReason reason) 
    { 
        System.IO.File.WriteAllText(@"c:/a.txt", reason.ToString()); 
    } 

注意: 
我一开始想在过期触发事件时给前台一个提示,想法很好,但在实际中是不能实现的,因为Web访问是无状态的,它不可能知道这是谁设置的,而且它是公用的,难道要给每一个在线的人都发一个提示?!它只能在服务端做一些操作,比如写文件,数据库的访问等。 

由以上看来,它既能加快程序响应速度,提高性能,又是存在服务端,解决安全性问题,还能灵活设置依赖条件,真是用五个字来形容也不为过啊:很好很强大! 
但是也不要滥用了,必竟是要占用服务器资源的啦! 

实际运用: 
我们一般都是在Web上展示数据库中的数据,所以如果cache能与数据库关联就好了,但好象上面没有提到数据库啊!所以我们得换一个思路 
建立一个触发器,当数据库中发生改变的时候,触发触发器写文件,然后将Cache关联到这个文件上,就可以实现数据库的更改影响cache的消亡与生成了 

以下是我参考的文档,写的比我好的多: 
在asp.net中如何管理cache 
http://www.cnblogs.com/aspnet2008/archive/2008/10/09/1307370.html 
ASP.NET Cache缓存的使用 
http://www.cnblogs.com/beyondjay/archive/2009/01/15/1376454.html 
ASP.NET中CACHE的INSERT有两个参数不理解 
http://zhidao.baidu.com/question/9967841.html 
asp.net cache用法,单点登陆 
http://heisetoufa.javaeye.com/blog/315447 
ASP.NET Cache 方案 
http://www.cnblogs.com/jeff377/archive/2008/08/28/1278989.html 
ASP.NET中缓存Cache的使用心得 
http://www.xueit.com/html/2009-02/21_702_00.html 
利用Cache技术,来有效的提高ASP.NET网站性能 
http://tech.it168.com/d/2008-01-14/200801142357414_1.shtml 
详情ASP.NET状态管理缓存Cache应用 
http://www.xueit.com/html/2009-02/21_703_00.html
posted @ 2009-04-14 15:23  永远的阿哲    http://www.cnblogs.com/ljzforever/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值