1、A缓存总结提高性能最好最快的办法当然是通过缓存来改善,对于任何一个 web 开发者都应该善用缓存。A 下的缓存机制十分强大,用好缓存机制可以让我们极大的改善 web 应用的性能,下面是一些总结的缓存的知识点,与大家分享交流:1.页面缓存 要实现页面输出缓存,只要将一条 OutputCache 指令添加到页面即可。 CacheProfile用于定义与该页关联的缓存设置的名称。是可选属性,默认值为空字符(“)。需要注意的是,包含在用户控件中的 OutputCache 指令不支持此属性。在页面中指定此属性时,属性值必须与 Web.config 文件 配置节下的outputCacheProfiles
2、元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。 NoStore该属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。需要注意的是,包含在用户控件中的 OutputCache 指令不支持此属性。将此属性设置为 true 等效于在请求期间执行代码“Response.Cache.SetNoStore();”。 Duration用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的 HTTP 响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration 属性是必需的,否则将会引起分析器错误。 Shared该属性定义一个布尔值
3、,用于确定用户控件输出是否可以由多个页共享。默认值为 false。注意,包含在 ASP.NET 页中的 OutputCache 指令不支持此属性。 Location用于指定输出缓存项的位置。其属性值是 OutputCacheLocation 枚举值,它们是 Any、Client、Downstream 、None、Server 和 ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。需要注意的是,包含在用户控件中的 OutputCache 指令不支持此属性。 SqlDependency该属性标识一组数据库/表名称对的字符串
4、值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency 类监视输出缓存所依赖的数据库中的表,因此,当更新表中的项时,使用基于表的轮询将从缓存中移除这些项。当通知(在 SQL Server 2005 中)与 CommandNotification 值一起使用时,最终将使用 SqlDependency 类向 SQL Server 2005 服务器注册查询通知。另外,SqlDependency 属性的 CommandNotification 值仅在 ASP.NET 页中有效。控件只能将基于表的轮询用于 OutputCache 指令。 VaryByControl该属性使
5、用一个分号分隔的字符串列表来更改用户控件的输出缓存。这些字符串代表在用户控件中声明的 ASP.NET 服务器控件的 ID 属性值。除非已经包含了 VaryByParam 属性,否则在 OutputCache 指令中,该属性是必需的。 VaryByCustom用于自定义输出缓存要求的任意文本。如果赋予该属性值是 browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义字符串,则必须在应用程序的 Global.asax 文件中重写 HttpApplication.GetVaryByCustomString 方法。 VaryByHeader该属性中包含由分号分隔的 HTTP 标头
6、列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版本。VaryByHeader 属性在所有 HTTP 1.1 缓存中启用缓存项,而不仅限于ASP.NET 缓存。用户控件中的 OutputCache 指令不支持此属性。 VaryByParam该属性定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用 GET 方法属性发送的查询字符串值对应,或与用 POST方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的查询字符
7、串或 POST 参数名称。值得注意的是,在输出缓存 ASP.NET 页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的 OutputCache指令中包含了 VaryByControl 属性。如果没有包含,则会发生分析器错误。如果不需要使缓存内容随任何指定参数发生变化,则可将该值设为“none”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。创建页面输出缓存文件依赖示例代码:Response.AddFileDependency(MapPath(“test.xml“); 如需要建立依赖多文件关系,则使用 AddFileDependencies()方法。 使用编程方
8、式设置页面缓存过期 示例代码:HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl(“/test.aspx“); 此方法只接受一个“虚拟绝对“路径,因此需用 Page.ResolveUrl()方法转换 使用编程方式设置多个页面缓存过期(创建键依赖(key dependency) 示例代码: 缓存页面:PageLoad: Cache.Insert(“key”,DateTime.Now); Response.AddCacheItemDependency(“key“); 通过此法向多个页面添加依赖项 移除依赖项:PageLoad: Cache.Remo
9、ve(“key“);以编程方式操作页面输出缓存操作由 Response.Cache 属性暴露的 HttpCachePolicy 类对象的方法。创建页面输出缓存配置2.部分页面缓存缓存后替换 采用声明方式,使用 Substitution 控件,设置 MethodName 属性所需的方法,此方法必须是静态方法,因为当前页输出缓存时,页面实例还没被创建。注:AdRotator 内部使用了缓存后替代。 以编程方式设置缓存后替换,使用 Response.WriteSubstitution()方法,好处:1,此方法引用的方法不一定是当前类的方法,可以是另一个类的实力或静态方法。2,可以在自定义控件中使用此
10、方法实现缓存后替换。 部分页面缓存:用户控件缓存 给用户控件添加指令。此指令包含一个 Shared 属性,可设置共享用户控件的输出缓存。以编程方式设置用户控件缓存当用户控件中包括指令时,可以通过用户控件的 CachePolicy 属性所暴露的 ControlCachePolicy 类的实例的属性控制修改空间如何缓存。创建用户控件缓存的文件依赖可以使用 CacheControlPolicy.Dependency 属性在一个缓存了的用户控件和文件系统中一个文件间创建一个依赖,示例代码: PageLoad: CacheDependency depend=new CacheDependency(Map
11、Path(“/test.xml“); this.CachePolicy.Dependency=depend; 缓存动态载入的用户控件可以使用 Page.LoadControl()方法载入用户控件,当具有缓存特性的用户控件被载入时,A Framework 自动一个 PartialCachingControl 类的实例包装用户控件。示例代码: PageLoad: PartialCachingControl cacheme=(PartialCachingControl)Page.LoadControl(“test.ascx“); Cacheme.CachePolicy.SetExpires(Date
12、Time.Now.AddSeconds(10); PlaceHolder1.Controls.Add(cacheme); Lable1.Text=cacheme.CachePolicy.Duration.ToString();3.使用 DataSource 缓存SqlDataSource、ObjectDataSource 、XmlDataSource 控件都包括了用于缓存 DataSource 承载的属性,好处是数据源控件可以在数据更新时自动重新载入数据。并且可以在多个页面间共享相同的数据,通过一些属性的组合来识别:SelectCommand、SelectParameters、Connecti
13、onString。如果属性相同,即共享相同的缓存数据。通过设置属性设置缓存过期策略包括绝对缓存(EnableCaching=“True“ CacheDuration=“xxx”)和 Sliding 缓存(EnableCaching=“True“ CacheExpirationPolicy=“Sliding“ CacheDuration=“xxx”) 使用 ObjectDataSource 控件缓存 通过设置控件的 EnableCaching、CacheExpirationPolicy、CacheDuration 属性以及SelectMethod 所制定的方法名来完成。使用 XmlDataSou
14、rce 控件缓存设置 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.NoSlidingExpira
15、tion,CacheItemPriority.NotRemovable,null); 3、在用于更改数据的页面上移除缓存项目(key); 如在 DetailsView 控件的 ItemInserted 事件中重新插入缓存项目,此时每个依赖于这个键值(key)的 DataSource 会自动重新载入数据,代码如下protected void DetailsView_ItemInserted(object sender,DetailsViewInsertedEventArgs e) Cache.Insert(“key“,Datetime.Now); 注:以上 key 值采用当前时间并非必须。4.C
16、ache 对象几乎可以给缓存添加任何对象,例如,可以添加自定义控件,DataSet,DataTable,ArrayList 和 List 到缓存。注意:使用从缓存中返回的任何项目,应该总是要检查项目是否为空,如果一个项目已经被删除了,则当将来试图从缓存中读取时,就会返回 null。 详细信息查看 msdnCache 成员 添加数据缓存到 Cache 对象示例代码: void Page_Load() DataTable dt=(DataTable)Cache“dtkey“; if(dt=null) dt=getdtFromDB(); /此处调用方法从数据库中返回数据项 DataTable Cac
17、he.Insert(“dtKey“,dt,null,DateTime.Now.AddHours(1),Cache.NoSlidingExpiration); /此处使用绝对过期策略添加项目 GridView1.DataSource=dt; GridView1.DataBind(); private DataTable getdtFromDB() /略 使用依赖添加项目A Framework 包括三种缓存依赖 1、 CacheDependency用于创建一个文件依赖或缓存键值依赖。 2、 SqlCacheDependency用于创建一个对于 Microsoft SQL Server 数据库表或
18、SQL Server 2005 数据库查询的依赖。 3、 AggregateCacheDependency用于使用多个 CacheDependency 对象创建依赖,例如,可以用该对象组合文件和 Sql 依赖。CacheDependency 类是基类,其他两个类都是从该类继承。指定缓存项目优先级 可以指定 CacheItemPriority 枚举类型任意值。配置缓存 详细信息查看 Msdn Caching 元素 5.使用 SQL 缓存依赖A Framework 支持两种类型的 SQL 缓存依赖:拉和推。第一种模式使用表轮询的 ASP.NET 实现,第二种模式使用 SQL Server 2005
19、 的查询通知功能。可以对任何最近版本的 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_SqlCacheTablesForC
20、hangeNotification 的数据表的一行数据被更新,来记录修改情况,A Framework 使用一个后台线程,来定期拉数据表的修改信息。如果有修改,则依赖于数据表的缓存项目被移除。 配置拉 SQL 缓存依赖: 1、 必须对一个或多个数据库表启用 SQL 缓存依赖。 可以使用框架中的 SqlCacheDependencyAdmin 类来配置 SQL 数据库支持拉 SQL 缓存依赖,由于调用该类的方法需要创建表、存储过程、trigger,出于安全考虑,A 进程并不应该被赋予这些权限,而是通过一个命令行工具来使用此类。 aspnet_regsql 详细信息访问 Msdn ASP.NET S
21、QL 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 Titles2、必须在 Web 配置文件中配置 SQL 缓存依赖。
22、 /通过 pollTime 的设置,定时拉数据库的修改 a、 对页面输出缓存使用拉 SQL 缓存依赖:指令指定 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
23、(); /此处调用方法从数据库中返回数据项 DataTable SqlCacheDependency sqlDepend=new SqlCacheDependecy(“Mydatabase“,“Mytable“); Cache.Insert(“dtKey“,dt,sqlDepend); GridView1.DataSource=dt; GridView1.DataBind(); private DataTable getdtFromDB() /略 使用推 SQL 缓存依赖通过 Service Broker 可以在数据库中的数据变更时自动给应用程序发送一个消息。 好处:A 应用程序不必定时拉数据
24、库的修改。 缺点:查询类型有诸多限制(如必须使用两部分的表明: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
25、 Database MyBase Set ENABLE_BROKER,启用。 c、为本地AspNet 帐号赋予需要的权限,如:Grant Subscribe Query Notifications To “yourserverAspnet”2.为推 SQL 缓存依赖配置应用程序 void Application_Start(object sender, EventArgs e) string conString=WebConfigurationManager.ConnectionStrings“MyContention1“.ConnectionString; SqlDependency.Sta
26、rt(conString); HttpContext context=HttpContext.Current; context.Cache.Insert( “key“,DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null ); a、对页面输出缓存使用推 SQL 缓存依赖: 当缓存整个 A 页面时,可以使用推 Sql 缓存依赖。如果包含在页面上的任何 Sql 命令的结果有变动,页面就会自动从缓存中过期。 SqlCommand 对象包含一个 Notifica
27、tionAutoEnlist 属性,该属性默认值为 true。当NotificationAutoEnlist 启用时,页面和命令间自动创建一个推缓存依赖。注意 SqlDataSource的 SelectCommand 必须符合查询要求。 b、对 DataSource 控件使用推 SQL 缓存依赖: 只需要设置 SqlcacheDependency 属性即可。设置 SqlCacheDependency=“CommandNotification” c、对 Cache 对象使用推 SQL 缓存依赖: void Page_Load() DataTable dt=(DataTable)Cache“dtk
28、ey“; 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
29、); Cache.Insert(“dtKey“,dt,sqlDepend); GridView1.DataSource=dt; GridView1.DataBind(); 注意,SqlCacheDependency 类的示例被创建了。一个 SqlCommand 对象被传递给SqlCacheDependency 类的构造函数。如果 SqlCommand 的结果变化了,则这个 DataTable 会自动从缓存中失效。这些命令的顺序很重要。必须在执行该命令之前创建SqlCacheDependency 对象。如果在创建 SqlCacheDependency 对象之前调用 Fill()方法,则依赖会被忽略。