`
ljzforever
  • 浏览: 114911 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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 参数中的日期以前并未从缓存中请求该项,则从缓存移除该项。

下面重点谈谈sql缓存依赖。
有两种方式:
第一种模式是使用表轮询的 ASP.NET 实现,拉模式,可以对任何最近版本的Ms SQL Server,包括Ms SQL server 2005 Express、Ms SQL Server 2000 和 Ms SQL Server 7.0,使用拉SQL缓存依赖。
第二种模式使用 SQL Server 2005 的查询通知功能,推模式,只能用于Ms SQL Server 2005和Ms SQL server 2005 Express,因为他们依赖SQL Server的Service Broker。
第一种主要是静态实现:
1.用aspnet_regsql命令配置数据库或者使用SqlCacheDependencyAdmin类。两者功能相等,在这里使用类来完成。
第一步:
在Global.asax全局应用程序类的Application_Start事件中写下:
SqlCacheDependencyAdmin.EnableNotifications(ConfigurationManager.ConnectionStrings["a"].ToString());
            SqlCacheDependencyAdmin.EnableTableForNotifications(ConfigurationManager.ConnectionStrings["a"].ToString(), "emp");
第一句是说启用这个连接字符串所指数据库的缓存
第二句是说启用这个连接字符串所指数据库的所指表的缓存

第二步:在web.config中进行配置:
<caching>
  <sqlCacheDependency enabled="true" pollTime="500">
    <databases>
      <add connectionStringName="a" name="test"/>
    </databases>
  </sqlCacheDependency>
</caching>

enabled:是否启用Sql依赖缓存
pollTime:轮询频率
connectionStringName:连接字符串名称
name:数据库名。

第三步:在页头写下page指令:
<%@ OutputCache Duration="100" SqlDependency="test:emp" VaryByParam="none"%>
SqlDependency后面的格式为:数据库名:表名

通过以上三步,就可实现数据库缓存了。

第二种主要是通过代码实现
第一步:在Global.asax全局应用程序类的Application_Start事件中写下:
SqlDependency.Start(ConfigurationManager.ConnectionStrings["a"].ToString());
在Application_End事件中写下:
SqlDependency.Stop(ConfigurationManager.ConnectionStrings["a"].ToString());
这里是打开此数据连接的查询依赖。
第二步:在需要的地方写下跟下面类似的代码:
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["a"].ToString());
SqlCommand cmd = new SqlCommand("select address from dbo.emp", con);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
SqlDataAdapter dap = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
dap.Fill(dt);
Cache.Insert("A", dt, dep);

用SqlCacheDependency类将SqlCommand类包装,就可以了。
注意
1.并不是说包装一下就好了,如下:
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["a"].ToString());
SqlCommand cmd = new SqlCommand("select address from dbo.emp", con);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
Cache.Insert("A", "abc", dep);
这样子写是无法实现缓存的,必须要把cmd执行一遍,甚至是这样的都可以:
con.Open();
cmd.ExecuteNonQuery();
con.Close();

2.查询类型有诸多限制(如必须使用两部分的表明:abo.mytabel,查询必须包含一个显示的列名表明:不能使用*,不能引用视图、临时表等,不能包含子查询、外连接、子连接,不能引用大对象、不能使用DISTINCT、COMPUTE、COMPUTE BY、INSERT关键字、不能包含许多聚合函数 等等)


优先级
就是当服务器内存资源不足的时候,对缓存区的数据进行如何处理
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());
    }

还有一个AggregateCacheDependency类,其实就是将CacheDependency集合作为一个缓存依赖整体。


注意:
我一开始想在过期触发事件时给前台一个提示,想法很好,但在实际中是不能实现的,因为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.iteye.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
ASP.Net缓存总结
http://www.mbsky.com/InfoView/Article_12249.html
剖析SQL Server 2005查询通知之基础篇
http://www.cnblogs.com/haowenbiao/archive/2008/05/11/1192765.html
asp.net缓存 总结5
http://www.c2008.cn/html/200901/21/20090121210534.htm
分享到:
评论

相关推荐

    asp.net知识库

    Coalesys PanelBar + R.a.d Treeview +Xml 构建的Asp.net 菜单和权限管理模块 突破屏蔽限制,自己的网站使劲弹新IE窗口 对页面SCROLLING的CSS不能生效原因 .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的...

    ASP.NET的网页代码模型及生命周期

    在ASP.NET中,网页包含视图状态来保存用户的信息,视图状态在页面发回到自身时,跨页过程存储和用户自己的页面的特定值,视图状态的优点如下所示。 q 不需要任何服务器资源。 q 在默认情况下,对控件启用状态的数据...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    6.1 ASP.NET状态管理 6.2 视图状态 6.2.1 视图状态示例 6.2.2 在视图状态中保存对象 6.2.3 视图状态评估 6.2.4 有选择地禁用视图状态 6.2.5 视图状态安全 6.3 在页面间传送信息 6.3.1 查询字符串 ...

    ASP.NET 3.5 开发大全

    1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 什么是.NET应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET...

    ASP.NET3.5从入门到精通

    1.1.2 ASP.NET 与ASP 1.1.3 ASP.NET 开发工具 1.1.4 ASP.NET 客户端 1.1.5 ASP.NET 3.5 新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET 应用程序需框架 1.2.1 什么是.NET 应用程序框架 1.2.2 公共语言运行时(CLR) ...

    ASP.NET4高级程序设计(第4版) 3/3

    6.1 ASP.NET状态管理 177 6.2 视图状态 179 6.2.1 视图状态示例 180 6.2.2 在视图状态中保存对象 181 6.2.3 视图状态评估 183 6.2.4 有选择地禁用视图状态 184 6.2.5 视图状态安全 185 6.3 在页面间...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    该书与《ASP.NET 2.0入门经典(第4版)》及其早期版本,曾影响到无数中国Web程序员。. ASP.NET允许Web站点为每个访问者显示独一无二的页面,而不是显示相同的静态HTML页面。ASP.NET 2.0的发布,使Web应用程序的...

    ASP.NET 3.5 开发大全word课件

    1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 什么是.NET应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET...

    ASP.NET 3.5 开发大全11-15

    1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 什么是.NET应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET...

    ASP.NET 3.5 开发大全1-5

    1.1.2 ASP.NET与ASP 1.1.3 ASP.NET开发工具 1.1.4 ASP.NET客户端 1.1.5 ASP.NET 3.5新增控件 1.1.6 ASP.NET 3.5 AJAX 1.2 .NET应用程序需框架 1.2.1 什么是.NET应用程序框架 1.2.2 公共语言运行时(CLR) 1.2.3 .NET...

    ASP.net实例光盘源码:

    CommonOperation/CustomCache.cs 系统缓存 UserCommonOperation/UserCommonOperation.cs 操作用户信息的组件 第8章(/Web2ASPNET2/) RSS/Admin/AddRole.aspx 添加角色 RSS/Admin/AddUser.aspx ...

    ASP.NET2.0高级编程(第4版)1/6

    该书与《ASP.NET 2.0入门经典(第4版)》及其早期版本,曾影响到无数中国Web程序员。 目录 第1章 ASP.NET 2.0概述1 1.1 简史1 1.2 ASP.NET 2.0的目标2 1.2.1 开发人员的效率3 1.2.2 管理5 1.2.3 性能和可伸缩性8...

    ASP.NET缓存管理

    在解释ASP.NET中的缓存管理之前,我先澄清一下,不同的人使用不同的术语来解释同样的概念,有些人把它描述为状态管理,有些人描述为缓存管理。我喜欢用缓存管理,或许是因为我喜欢这个词“Cache”吧。 但是就所指...

    ASP.NET缓存管理的几种方法

    尽管缓存管理在Windows应用...在ASP.NET中,我们会遇到像Session,Application以及Cache这些对象,为了有效地在web应用中有效地使用它们,理解他们之间的不同对我们来说非常重要。 背景 在这篇文章中,我将谈到在ASP.NE

    asp.net面试题

    八、ASP.NET有多种维护状态的技术,以下哪种是保存在客户端的?( ) A.VIEWSTATEB.SESSIONC.APPLICATIOND.数据CACHE 九、Cookies的默认生命周期有多长? ( ) A.20分钟B.30分钟C. 一天D.随浏览器的关闭而失效 十...

    ASP.Net性能优化.ppt

    ASP.Net性能优化 1.会话状态的恰当选择 2.Viewstate优化 3.Cache优化 4.控件优化与选择 5.返回多个记录集 6.数据分页优化 7.Ado.Net对象选择 8.数据前绑定 9.存储过程优化,C# Coding优化

    在ASP.NET 2.0中操作数据之五十九:使用SQL缓存依赖项SqlCacheDependency

    当缓存数据库数据时,最理想的状态是数据一直驻留在内存,直到数据库发生了改动。在ASP.NET 2.0,可以通过编程或声明代码的方式使用SQL cache dependencies,配合SQL Server 2005来实现此功能。

    ASP.NET中Application、Cookie、Session、Cache和ViewState

    我们在做ASP.NET开发的时候经常会用到回话,我们在回话中存储一些数据,下面让我们来一一介绍一下Application、Cookie、Session、Cache和ViewState,以便我们选择在什么时候使用它们。 一、Application Application...

Global site tag (gtag.js) - Google Analytics