`
ljzforever
  • 浏览: 117507 次
  • 性别: 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中如何管理cache

    ### ASP.NET 中如何管理 Cache 在 ASP.NET 开发过程中,高效地管理和利用缓存(cache)是提高应用程序性能的关键因素之一。本文将详细探讨 ASP.NET 中 cache 的管理方式及其应用场景。 ### 1. 什么是 ASP.NET Cache...

    asp.net状态管理

    ASP.NET状态管理是Web应用程序开发中的关键概念,它允许开发者在用户交互的不同阶段保存和恢复数据,从而提供更丰富的用户体验。在ASP.NET中,状态管理主要包括以下几种方式: 1. **视图状态(ViewState)**:这是ASP...

    ASP.NET相册管理

    ASP.NET相册管理系统基于.NET Framework或.NET Core运行时环境,它提供了强大的服务器端控件、页面生命周期管理、状态管理以及自动处理HTTP请求和响应的能力。ASP.NET使用C#或VB.NET等语言编写代码,并通过编译后...

    asp.net典型模块与项目实战大全

    1. **第18章** - 可能涉及的是ASP.NET中的状态管理,这包括视图状态(ViewState)、控制状态(ControlState)、cookie、session、应用程序状态(Application State)以及查询字符串等。状态管理在Web开发中至关重要...

    跟我一起学Visual Studio 2005(7):ASP.NET状态管理

    《跟我一起学Visual Studio 2005(7):ASP.NET状态管理》是一套全面讲解Visual Studio 2005开发环境与ASP.NET状态管理技术的教程。在这个专题中,我们将深入探讨如何在Web应用程序中有效地管理和维护用户的状态信息,...

    基于ASP.NET的通用项目管理系统源码.zip

    【标题】中的“基于ASP.NET的通用项目管理系统源码”表明这是一个使用ASP.NET技术开发的通用型项目管理软件的源代码。ASP.NET是微软公司推出的一种Web应用程序框架,用于构建动态网站、Web应用和Web服务。它基于.NET...

    BBS论坛管理系统(asp.net)

    3. **状态管理**: ASP.NET 提供了Session、Cookie等多种状态管理机制,用于跟踪用户状态和页面状态。 4. **AJAX技术**: 通过异步JavaScript和XML,实现页面的部分更新,提升用户体验。 5. **缓存技术**: 可以使用...

    跟我一起学Visual.Studio.2005(7):ASP.NET状态管理

    ASP.NET状态管理是Web开发中的核心概念之一,尤其是在使用Visual Studio 2005进行开发时,理解并熟练掌握状态管理对于构建动态、交互性强的Web应用程序至关重要。本篇文章将深入探讨这一主题。 首先,ASP.NET的状态...

    asp.net商品销售管理系统

    ASP.NET商品销售管理系统可能采用缓存技术(如Output Cache、Data Cache)来减少数据库访问,提升性能。同时,数据库查询优化、页面压缩和合并、异步操作等也是常见的性能优化手段。 9. **报表和分析** 系统可能...

    Asp.net 项目实战 酒店管理系统

    6. Session和Cache:Asp.Net提供了Session和Cache机制来管理用户状态和缓存数据,优化性能。在酒店系统中,例如,可以使用Session存储用户登录信息,Cache则可用于暂存频繁访问的数据,减少数据库访问压力。 7. ASP...

    ASP.NET毕业设计——ASP.NET客户关系管理系统的实现(论文+源代码+文献综述+外文翻译+答辩PPT).zip

    5. **状态管理和会话控制**:ASP.NET提供了内置的状态管理机制,如视图状态、隐藏字段和会话状态,这些在CRM系统中可能用于保持用户操作的上下文,尤其是在多页面交互时。 6. **安全性**:保护用户数据和防止未授权...

    ASP.NET 完整项目10个(C#)

    9. **部署与配置**:了解如何将ASP.NET项目部署到IIS服务器并进行配置,是实际开发中不可或缺的部分。这些项目可能包含部署和配置文件的示例。 10. **Web服务和API**:项目可能涉及SOAP或RESTful Web服务的创建,...

    asp.net实现小区物业内部管理网

    - 使用ASP.NET的缓存机制,如Output Cache、SqlCacheDependency等,减少数据库查询,提高系统性能。 9. **错误处理与日志记录** - 设置全局错误处理机制,捕获并处理运行时异常,确保系统的稳定运行。 - 使用log...

    基于ASP.net的驾校管理系统源码.zip

    ASP.NET提供了多种状态管理机制,如视图状态、隐藏字段、Session、Application等,用于在页面间或服务器会话期间保存用户的状态信息。这对于管理驾校系统中用户的登录状态、浏览历史等至关重要。 【部署与配置】 ...

    asp.net二手交易系统

    - 为了保证系统的高性能,可以使用缓存技术(如ASP.NET的Cache对象)、数据库索引、异步编程等方法来提升处理速度。 综上所述,"asp.net二手交易系统"是一个涵盖多个技术领域的项目,涉及到Web开发的各个方面,...

    asp.net服务器控件与组件开发

    《ASP.NET服务器控件与组件开发》是一门深入探讨ASP.NET技术中服务器控件和组件构建的专业主题。在ASP.NET框架中,服务器控件和组件是网页开发的核心元素,它们为开发者提供了丰富的功能,简化了网页交互逻辑的实现...

    ASP.NET毕业设计——ASP.NET公文管理系统的设计与实现(源代码+论文).zip

    ASP.NET公文管理系统的设计与实现是一项典型的Web应用开发项目,主要使用了Microsoft的ASP.NET技术。ASP.NET是.NET框架的一部分,提供了一套用于构建动态网站、Web应用程序和Web服务的强大工具和库。在这个毕业设计...

    基于asp.net的同学录

    ASP.NET提供了多种状态管理机制,如视图状态(ViewState)、控制状态(Control State)、Session和Cookie等,以在页面间保持数据。在同学录系统中,可能会使用Session来跟踪用户登录状态和个性化设置。 7. **错误...

Global site tag (gtag.js) - Google Analytics