提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存。Asp.net下的缓存机制十分强大,用好缓存机制可以让我们极大的改善web应用的性能,下面是一些总结的缓存的知识点,与大家分享交流:

1.页面缓存 

要实现页面输出缓存,只要将一条 OutputCache 指令添加到页面即可。  

<%@ OutputCache CacheProfile=" " NoStore="True | False" Duration="#ofseconds" Shared="True | False"Location="Any | Client | Downstream | Server | None | ServerandClient " SqlDependency="database/table name pair | CommandNotification " VaryByControl="controlname" VaryByCustom="browser | customstring"VaryByHeader="headers" VaryByParam="parametername" %>  

CacheProfile

用于定义与该页关联的缓存设置的名称。是可选属性,默认值为空字符("")。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。在页面中指定此属性时,属性值必须与Web.config文件<outputCacheSettings>配置节下的outputCacheProfiles元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

NoStore

该属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。将此属性设置为true等效于在请求期间执行代码“Response.Cache.SetNoStore();”。

Duration

用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的HTTP响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。

Shared

该属性定义一个布尔值,用于确定用户控件输出是否可以由多个页共享。默认值为false。注意,包含在ASP.NET页中的@ OutputCache指令不支持此属性。

Location

用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、Server和ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。

SqlDependency

该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency类监视输出缓存所依赖的数据库中的表,因此,当更新表中的项时,使用基于表的轮询将从缓存中移除这些项。当通知(在SQL Server 2005中)与CommandNotification值一起使用时,最终将使用SqlDependency类向SQL Server 2005服务器注册查询通知。另外,SqlDependency属性的CommandNotification值仅在ASP.NET页中有效。控件只能将基于表的轮询用于@ OutputCache指令。

VaryByControl

该属性使用一个分号分隔的字符串列表来更改用户控件的输出缓存。这些字符串代表在用户控件中声明的ASP.NET服务器控件的ID属性值。除非已经包含了VaryByParam属性,否则在@ OutputCache指令中,该属性是必需的。

VaryByCustom

用于自定义输出缓存要求的任意文本。如果赋予该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义字符串,则必须在应用程序的Global.asax文件中重写HttpApplication.GetVaryByCustomString方法。

VaryByHeader

该属性中包含由分号分隔的HTTP标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版本。VaryByHeader属性在所有HTTP 1.1缓存中启用缓存项,而不仅限于ASP.NET缓存。用户控件中的@ OutputCache指令不支持此属性。

VaryByParam

该属性定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的查询字符串或POST参数名称。值得注意的是,在输出缓存ASP.NET页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的@ OutputCache指令中包含了VaryByControl属性。如果没有包含,则会发生分析器错误。如果不需要使缓存内容随任何指定参数发生变化,则可将该值设为“none”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。 
      
       创建页面输出缓存文件依赖

示例代码:Response.AddFileDependency(MapPath("test.xml"));
       如需要建立依赖多文件关系,则使用AddFileDependencies()方法。
       
       使用编程方式设置页面缓存过期
       
       
示例代码:HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/test.aspx"));
       此方法只接受一个"虚拟绝对"路径,因此需用Page.ResolveUrl()方法转换
       
       使用编程方式设置多个页面缓存过期(创建键依赖(key dependency))
       
       示例代码:
       缓存页面:PageLoad: 
        Cache.Insert(“key”,DateTime.Now);
        Response.AddCacheItemDependency("key");
       通过此法向多个页面添加依赖项
       移除依赖项:PageLoad:
       Cache.Remove("key");

以编程方式操作页面输出缓存

操作由Response.Cache属性暴露的HttpCachePolicy类对象的方法。

创建页面输出缓存配置

<system.web>
          <caching>
                <outputCacheSettings>
                    <outputCacheProfiles>
                            <add name="CacheProfile1" duration="60" />
                    </outputCacheProfiles>
                </outputCacheSettings>
          </caching>
       </system.web>

2.部分页面缓存

缓存后替换
       
       采用声明方式,使用Substitution控件,设置MethodName属性所需的方法,此方法必须是静态方法,因为当前页输出缓存时,页面实例还没被创建。注:AdRotator内部使用了缓存后替代。
       
       以编程方式设置缓存后替换,使用Response.WriteSubstitution()方法,好处:1,此方法引用的方法不一定是当前类的方法,可以是另一个类的实力或静态方法。2,可以在自定义控件中使用此方法实现缓存后替换。
       
       部分页面缓存:用户控件缓存
       
       给用户控件添加<%@ OutputCache%>指令。此指令包含一个Shared属性,可设置共享用户控件的输出缓存

以编程方式设置用户控件缓存

当用户控件中包括<%@ OutputCache%>指令时,可以通过用户控件的CachePolicy属性所暴露的ControlCachePolicy类的实例的属性控制修改空间如何缓存。

创建用户控件缓存的文件依赖

可以使用CacheControlPolicy.Dependency属性在一个缓存了的用户控件和文件系统中一个文件间创建一个依赖,示例代码:
       PageLoad:
       CacheDependency depend=new CacheDependency(MapPath("~/test.xml"));
       this.CachePolicy.Dependency=depend;
       
       缓存动态载入的用户控件

可以使用Page.LoadControl()方法载入用户控件,当具有缓存特性的用户控件被载入时,Asp.net Framework自动一个PartialCachingControl类的实例包装用户控件。示例代码:
       PageLoad:
       PartialCachingControl cacheme=(PartialCachingControl)Page.LoadControl("test.ascx");
       Cacheme.CachePolicy.SetExpires(DateTime.Now.AddSeconds(10));
       PlaceHolder1.Controls.Add(cacheme);
       Lable1.Text=cacheme.CachePolicy.Duration.ToString();

3.使用DataSource缓存

SqlDataSource、ObjectDataSource、XmlDataSource控件都包括了用于缓存DataSource承载的属性,好处是数据源控件可以在数据更新时自动重新载入数据。并且可以在多个页面间共享相同的数据,通过一些属性的组合来识别:SelectCommand、SelectParameters、ConnectionString。如果属性相同,即共享相同的缓存数据。

通过设置属性设置缓存过期策略

包括绝对缓存(EnableCaching="True" CacheDuration=“xxx”)和Sliding缓存(EnableCaching="True" CacheExpirationPolicy="Sliding" CacheDuration=“xxx”)
       
       使用ObjectDataSource控件缓存
       
       通过设置控件的EnableCaching、CacheExpirationPolicy、CacheDuration属性以及SelectMethod所制定的方法名来完成。

使用XmlDataSource控件缓存

设置DataFile属性创建一个文件依赖。

创建数据源控件键值依赖
       
       操作步骤
       1、设置数据源控件的CacheKeyDependency属性(key);
       2、在Global.asax创建初始化的(key)缓存项目。代码如下:
       Void Application_Start(Object Sender,EventArgs e)
        {
             HttpContext context=HttpContext.Current;
             context.Cache.Insert(
             "key",DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null
            );
        }
       3、在用于更改数据的页面上移除缓存项目(key);
       如在DetailsView控件的ItemInserted事件中重新插入缓存项目,此时每个依赖于这个键值(key)的DataSource会自动重新载入数据,代码如下:
       protected void DetailsView_ItemInserted(object sender,DetailsViewInsertedEventArgs e)
       {
           Cache.Insert("key",Datetime.Now);
        }
       注:以上key值采用当前时间并非必须。

4.Cache对象

几乎可以给缓存添加任何对象,例如,可以添加自定义控件,DataSet,DataTable,ArrayList和List到缓存。注意:使用从缓存中返回的任何项目,应该总是要检查项目是否为空,如果一个项目已经被删除了,则当将来试图从缓存中读取时,就会返回null。
       详细信息查看msdnCache 成员
       添加数据缓存到Cache对象示例代码:
        void Page_Load()
        {
             DataTable dt=(DataTable)Cache["dtkey"];
              if(dt==null)
                {
                      dt=getdtFromDB();   //此处调用方法从数据库中返回数据项DataTable
                      Cache.Insert("dtKey",dt,null,DateTime.Now.AddHours(1),Cache.NoSlidingExpiration);   //此处使用绝对过期策略添加项目
                 }
                GridView1.DataSource=dt;
                GridView1.DataBind();
        } 
         private DataTable getdtFromDB()
       {
          //略......
        }

使用依赖添加项目

Asp.net Framework包括三种缓存依赖
       1、CacheDependency——用于创建一个文件依赖或缓存键值依赖。
       2、SqlCacheDependency——用于创建一个对于Microsoft SQL Server数据库表或SQL Server 2005数据库查询的依赖。
       3、AggregateCacheDependency——用于使用多个CacheDependency对象创建依赖,例如,可以用该对象组合文件和Sql依赖。

CacheDependency类是基类,其他两个类都是从该类继承。

指定缓存项目优先级
       
       可以指定CacheItemPriority枚举类型任意值。

配置缓存
        
       详细信息查看Msdn Caching元素

5.使用SQL缓存依赖
       
Asp.net Framework支持两种类型的SQL缓存依赖:拉和推。第一种模式使用表轮询的 ASP.NET 实现,第二种模式使用 SQL Server 2005 的查询通知功能。可以对任何最近版本的Ms SQL Server,包括Ms SQL server 2005 Express、Ms SQL Server 2000 和 Ms SQL Server 7.0,使用拉SQL缓存依赖。第二种类型推缓存依赖则只能用于Ms SQL Server 2005和Ms SQL server 2005 Express,因为他们依赖SQL Server的Service Broker。
     
       使用拉SQL缓存依赖
       实质上拉SQL缓存依赖使用数据库tigger,当表被修改时,tigger被触发,名为AspNet_SqlCacheTablesForChangeNotification的数据表的一行数据被更新,来记录修改情况,Asp.net Framework使用一个后台线程,来定期拉数据表的修改信息。如果有修改,则依赖于数据表的缓存项目被移除。
       配置拉SQL缓存依赖:
       1、必须对一个或多个数据库表启用SQL缓存依赖。
             a.
             可以使用框架中的SqlCacheDependencyAdmin类来配置SQL数据库支持拉SQL缓存依赖,由于调用该类的方法需要创建表、存储过程、trigger,出于安全考虑,Asp.net进程并不应该被赋予这些权限,而是通过一个命令行工具来使用此类。
             aspnet_regsql 详细信息访问Msdn ASP.NET SQL Server 注册工具 (Aspnet_regsql.exe)

简要步骤: 1、启用特定数据库的SQL缓存依赖。
             aspnet_regsql -c "Data Source=localhost;integrated Security=True;Initial Catalog=Pubs" -ed
                                2、启用特定表的SQL缓存依赖。
             aspnet_regsql -c "Data Source=localhost;integrated Security=True;Initial Catalog=Pubs" -ed -t Titles
         b.
       2、必须在Web配置文件中配置SQL缓存依赖。
             <!-- caching section group -->
                <caching>
                <sqlCacheDependency enabled = "true" pollTime = "1000" >   //通过pollTime 的设置,定时拉数据库的修改
                    <databases>
                      <add name="Northwind" 
                         connectionStringName="NorthwindConnectionString1"
                       pollTime = "1000" 
                      />
                    </databases>
                </sqlCacheDependency>
                </caching>

a、 对页面输出缓存使用拉SQL缓存依赖:<%@ OutputCache%>指令指定sqlDependency属性值:库名和表名(Mydatabase:Mytable);  
       b、对DataSource控件使用拉SQL缓存依赖:为DataSource控件sqlDependency属性指定值:库名和表名(Mydatabase:Mytable);
       c、对Cache对象使用拉SQL缓存依赖
       void Page_Load()
        {
             DataTable dt=(DataTable)Cache["dtkey"];
              if(dt==null)
                {
                      dt=getdtFromDB();   //此处调用方法从数据库中返回数据项DataTable
                      SqlCacheDependency sqlDepend=new SqlCacheDependecy("Mydatabase","Mytable");
                      Cache.Insert("dtKey",dt,sqlDepend); 
                 }
                GridView1.DataSource=dt;
                GridView1.DataBind();
        } 
         private DataTable getdtFromDB()
       {
          //略......
        }

原理:添加版本表(id,version)
为XX表添加insert,update,delete触发器,当XX被修改时,则修改版本表里的数据
1、需要启用:aspnet_regsql.exe
注册:aspnet_regsql -S . -E -ed -d 数据库名 -et -t 版本表名
删除:aspnet_regsql -S . -E -d 数据库名 -dt -t 版本表名
2、配置web.config
<system.web>
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="MS" connectionStringName="conStr2" pollTime="15000"/>
</databases>
</sqlCacheDependency>
</caching>
后台源码:
page_load:
if(Cache["list"]==null)
{
List<Aticle> list = new Bll.AticleManager().GetAll();
sbHtml.Append("从数据库获得的数据,再保存在缓存中:<br/>");
foreach(Aticle a in list)
{
sbHtml.Append("文章标题:"+a.Title+"<br/>");
}
// Cache["list"] = sbHtml.ToString();
//web.config中name的名称,数据库中的表名
System.Web.Caching.SqlCacheDependency sqlDep = new SqlCacheDependency("MS","CacheDep");                                                              Cache.Add("list",sbHtml.ToString(),sqlDep,Cache.NoAbsoluteExpiration,Cache.NoSlidingExpiration,CacheItemPriority.Normal,CallBack);
}
else
{
sbHtml.Append("从缓存中获得的数据:<br/>"+Cache["list"].ToString());
}
//回调函数
public void CallBack(string key,object value,CacheItemRemovedReason reason)
{
//同上
}

使用推SQL缓存依赖
       通过Service Broker可以在数据库中的数据变更时自动给应用程序发送一个消息。
       好处:Asp.net应用程序不必定时拉数据库的修改。
       缺点:查询类型有诸多限制(如必须使用两部分的表明:abo.mytabel,查询必须包含一个显示的列名表明:不能使用*,不能引用视图、临时表等,不能包含子查询、外连接、子连接,不能引用大对象、不能使用DISTINCT、COMPUTE、COMPUTE BY、INSERT关键字、不能包含许多聚合函数 等等)
       1.推SQL缓存依赖配置数据库
       启用Ms SQL Server 2005 Service Broker:
       a、可以通过:Select name ,is_broker_enabled from sys_databases,查询是否对特定的数据库激活。
       b、通过:Alter Database MyBase Set ENABLE_BROKER,启用。
       c、为本地AspNet帐号赋予需要的权限,如:Grant Subscribe Query Notifications To “yourserver\Aspnet”

2.为推SQL缓存依赖配置应用程序
       void Application_Start(object sender, EventArgs e)
       {
             string conString=WebConfigurationManager.ConnectionStrings["MyContention1"].ConnectionString;
             SqlDependency.Start(conString);
             HttpContext context=HttpContext.Current;
             context.Cache.Insert(
             "key",DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null
            );
        }

a、对页面输出缓存使用推SQL缓存依赖
       当缓存整个Asp.net页面时,可以使用推Sql缓存依赖。如果包含在页面上的任何Sql命令的结果有变动,页面就会自动从缓存中过期。
       SqlCommand对象包含一个NotificationAutoEnlist属性,该属性默认值为true。当NotificationAutoEnlist启用时,页面和命令间自动创建一个推缓存依赖。注意SqlDataSource的SelectCommand必须符合查询要求。
       
    b、对DataSource控件使用推SQL缓存依赖
       只需要设置SqlcacheDependency属性即可。设置SqlCacheDependency=“CommandNotification”
       
    c、对Cache对象使用推SQL缓存依赖
       void Page_Load()
        {
             DataTable dt=(DataTable)Cache["dtkey"];
              if(dt==null)
                {
                      string conString=WebConfigurationManager.ConnectionStrings["MyContention1"].ConnectionString;
                      SqlDatadapter dad=new SqlDataAdapter("Select a,b From dbo.Mytable",conString); //注意查询符合要求
                      SqlCacheDependency sqlDepend=new SqlCacheDependecy(dad.SelectCommand);
                      dt=new DataTable();
                      dad.Fill(dt);
                      Cache.Insert("dtKey",dt,sqlDepend); 
                 }
                GridView1.DataSource=dt;
                GridView1.DataBind();
        }
       注意,SqlCacheDependency类的示例被创建了。一个SqlCommand对象被传递给SqlCacheDependency类的构造函数。如果SqlCommand的结果变化了,则这个DataTable会自动从缓存中失效。这些命令的顺序很重要。必须在执行该命令之前创建SqlCacheDependency对象。如果在创建SqlCacheDependency对象之前调用Fill()方法,则依赖会被忽略。

转载于:https://www.cnblogs.com/findchance/archive/2012/09/04/2670252.html

ASP.Net缓存总结相关推荐

  1. 浅谈ASP.NET 缓存技术

    缓存是指系统或应用程序将频繁使用的数据保存到内存中,当系统或应用程序再次使用时,能构快速的获取数据.它的弊端在于显示的内容可能不是最新,最精确的.ASP.Net 缓存主要分为两大类: 网页输出缓存和应 ...

  2. petshop4.0 详解之四(PetShop之ASP.NET缓存)

    <p>如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引入了这种名为高速缓冲存储器(Cache)的技术.因为Cache的存 ...

  3. asp.net缓存机制

    一.缓存的类别 1.页面输出ASP.NET数据缓存 页面输出缓存是一种传统级别的相对简单的缓存机制.它将页面数据缓存在服务器内存中,当有客户端再次请求这些内容的时候,服务器可以直接将这些页面数据输出, ...

  4. [转]ASP.Net缓存总结

    ASP.Net缓存总结 Asp.net 缓存技术总结 2008-04-01 17:29 提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存.Asp.net下的缓存机制十 ...

  5. PetShop之ASP.NET缓存

    <解剖PetShop>系列之四 四 PetShop之ASP.NET缓存 如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引 ...

  6. PetShop 4.0 详解之四(PetShop之ASP.NET缓存)

    如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引入了这种名为高速缓冲存储器(Cache)的技术.因为Cache的存取速度比内存快,因 ...

  7. ASP.NET缓存全解析4:应用程序数据缓存(转)

    ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...

  8. ASP.Net缓存 1

    提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存.Asp.net下的缓存机制十分强大,用好缓存机制可以让我们极大的改善web应用的性能. 提高性能最好最快的办法当然是 ...

  9. PetShop之ASP.NET缓存(转载)

    <解剖PetShop>系列之四 四 PetShop之ASP.NET缓存 如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引 ...

  10. ASP+页缓存OutputCache Duration用法

    声明的方式控制   ASP.NET   页或页中包含的用户控件的输出缓存策略.有关输出缓存的更多信息,请参见   ASP.NET   缓存功能.         <%@   OutputCach ...

最新文章

  1. Reveal真机查看任意APP
  2. 要啥给啥的写作AI:新闻评论小说都能编,题材风格随便选,真假难辨,16亿参数模型已开源...
  3. ubuntu11.10设置了pppoe(自动拨号后),开机速度慢和无法连接无线网都解决办法...
  4. python骚操作之——判断整数
  5. HTML的DOM和XML的DOM对象的区别
  6. pycharm error:no module named caffe
  7. 蓝桥杯 ADV-169 算法提高 士兵排队问题
  8. JAVA练手--数组
  9. 数据结构:八大数据结构分类
  10. ESP32编程使用OLED屏
  11. PyCharm 下载/上传gitlab 代码
  12. 洛谷P2258 子矩阵[2017年5月计划 清北学堂51精英班Day1]
  13. 计算机科学 投稿 邮箱,《计算机时代》期刊投稿【编辑部_邮箱_地址_怎么样_版面费_代发表】...
  14. pascal学习小记(六)---VMT
  15. 4款一眼万年的精品软件,免费又好用,可惜很多人不知道
  16. 如何做好企业网络营销推广?从本质上去理解互联网开始!
  17. 阿里云无影云电脑ubantu中文失败解决方案
  18. 嵌入式Linux学习笔记(1-1)——linux系统搭建
  19. 如何在Unity实现从纹理中生成法线贴图?
  20. sdm660代码编译和刷机

热门文章

  1. OpenCV-python学习笔记(二)——image processing图像基本处理
  2. js ws 状态_node.js中ws模块创建服务端和客户端,网页WebSocket客户端
  3. es6 嵌套数组循环_ES6 常用数组循环
  4. 对列表中k之前和之后的元素分别进行逆序
  5. 翁恺老师C语言学习笔记(八)数组
  6. SAP License:SAP顾问该不该参与数据搜集
  7. 读懂现金贷产品的客群风险标签维度
  8. MySQL高级知识(三)——索引
  9. 我的 Hive 为什么跑不起来/跑得慢?看看是不是少了这几行代码?
  10. 微信小程序-腾讯地图显示偏差问题