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

asp.net 缓存研究

阅读更多

最近因项目要求,需要研究asp.net缓存,可是查阅了书本,msdn,网上后有点失望,真是天下文章一大抄啊,大家

讲来讲去都是那么几点,没有条理,没有重点,也没有心得,所以我决定自己来写一篇,当然,我是没有能力来改变

这一现象的,只是写来自己备忘罢了。

 

首先有几点要说明:
1.个人认为缓存只有两种:页输出缓存与应用程序数据缓存。一般大家也是这么认为的,但是有另外一部份人却把

这两个部份分了又分,搞出三五种出来。这就让人感觉很多余了。
2.所谓控件缓存,其实是用户控件缓存。可能是我理解有问题,我一开始还以为那种html控件,web控件也可以进行

缓存的。所以说定义名称要定义清楚。
3.实现缓存有两种方式:在aspx页面的顶部写页处理指令或者在cs代码里写代码(又叫缓存API),一种是静态设置

,一各是动态设置。网上总有些人喜欢说来说去又不总结清楚,搞的人很烦。
4.实际上只要用到了缓存就一定有缓存依赖。只是有些不那么明显。在我看的文章里一般都把缓存依赖单独作为一

章讲解,这是好事,因为在缓存的高级技术里缓存依赖是很重要的,但这并不代表有些缓存就没有缓存依赖。

 

 

好了,下面言归正传。我只讲常用的东东。

 

1.页面输出缓存。其实用户控件缓存跟它没有大的区别,只有一个location不能使用,在这里就一并讲了吧。
page指令:
<%@ OutputCache Duration="10" VaryByParam="*" VaryByControl="txtInput" %>
OutputCache是指令名。
Duration是缓存时长,单位是秒。
VaryByParam是跟据什么进行缓存。有两个特殊的值:none表示不随任何参数的不同而缓存,就是只缓存一个版本,*

表示随任何参数的不同而缓存,表示只要参数发生变化,就缓存一个新版本。
VaryByControl是跟据控件名进行缓存。这里的控件是指一般的服务器控件,不能是用户控件,不然会出现意想不到

的结果。

 

缓存API:
虽然页面输出缓存与用户控件缓存在页面指令方面差不多,但在api上面有所区别


页面缓存api:
映射的是System.Web.HttpCachePolicy类。
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(3));

第一句对应的是Location,是说缓存在哪,public是哪里都缓存,nocache是都不缓存,private是客户端缓存,还有

其它几个选项。比较关注的是:客户端,代理服务器,服务器。
第二句对应的是Duration,是说缓存时长,这是个绝对时间,是说到了那个时就是取消缓存。
Response.Cache.VaryByParams["none"] = true;
对应的是VaryByParam
用中括号括起参数,中间可用分号分隔多个参数,true表示启用此参数。

没有对应VaryByControl的。

Response.Cache.SetSlidingExpiration(true);
当用了这一句的时候,所有缓存设置都不启作用了,原因是这个属性是用给代理服务器之类的处于浏览器和Web服务

器之间的缓存使用的,而不是给Web服务器本身的.是特意设计成这样的.

Response.Cache.SetNoServerCaching()
表示取消当前所有服务器缓存。

 

用户控件缓存api:


PartialCachingAttribute类,这是第一种方式
用户控件也可以通过标明类属性的方式完成缓存设置
在用户控件的后台代码类上面加上:
[PartialCaching(int duration)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, bool

shared)]
[PartialCaching(int duration, string varyByParams, string varyByControls, string varyByCustom, string

sqlDependency, bool shared)]
在这里的设置duration之类的与在page指令中投置duration之类的效果一样


ControlCachePolicy类,这是第二种方式
在使用这种方式之前,必须保证用户控件已使用page指令或PartialCachingAttribute类进行了封装,否则会报异常


这个类是在动态加载用户控件时使用的,没有使用缓存时的加载具体请参看我的另外一篇文章:如何以编程方式加载用户控件
PartialCachingControl my = (PartialCachingControl)LoadControl("usercon.ascx");
ControlCachePolicy cache = my.CachePolicy;
cache.Duration = TimeSpan.FromSeconds(3);
Controls.Add(my);
第一句是动态加载此用户控件,当用户控件启动缓存后,asp.net会将其嵌入在PartialCachingControl类中,所以必

须强转成PartialCachingControl。
第二句是获取PartialCachingControl的CachePolicy属性,是ControlCachePolicy类型,真正操作缓存的是这个类。
第三句是设置过期时间,没什么好说的
第四句是将动态生成的用户控件加入到主目录控件树中,没什么好说的。
我在这里只用了一个方法,其实它有很多方法,只要是在page指令里能设置的这里都可以进行设置。

 

在web.config中配置缓存

如果很多页面或用户控件使用相同的配置,则可以在web.config中进行配置后在page指令中统一调用。

在web.config中:

<caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="a" duration="3" varyByParam="none"/>
        </outputCacheProfiles>
      </outputCacheSettings>
</caching>

在page指令中:

<%@ OutputCache CacheProfile="a" %>

 

综上所述:
对于页面输出缓存,用page指令来完成静态设置,用System.Web.HttpCachePolicy类来完成动态设置
对于用户控件缓存,用page指令或PartialCachingAttribute类来完成静态设置,用ControlCachePolicy类来完成动

态设置。


以上所说的都是对整体的缓存,页面是一个整体,用户控件相对来说也是一个整体,下面要说的是另外一种思路,

2.0新增的:整体缓存,部分替换,也就是说,只对页面或者用户控件的一部份进行更新。

 

有两种方式:一种是使用控件,一种是控件api


使用substitution控件
从工具栏拖一个这样的控件就可以了。它只有一个methodname属性。该属性用于获取或者设置此控件相关联的回调函

数名称。此函数必须符合以下3个条件:
静态方法
参数类型为httpcontext
返回string类型的值

例如:在一个启用的输出缓存的页面上使用这个控件:
<asp:Substitution ID="subText" runat="server" MethodName="GetData" />
然后在后台写下这样的代码:
public static string GetData(HttpContext context)
{

            return DateTime.Now.ToString();
}
这样页面其它部分会进行缓存,但是这个地方会不停的打印新的时间。

注意:
substitution控件无法访问页面内的其它控件,只能使用传递给它的参数来访问当前页的上下文。
用户控件不能使用此控件
此控件不能包含或自己呈现任何标记,显示内容完全取决于方法的返回字符串。

 

使用控件api
主要就是Response.WriteSubstitution(getData)方法
它会将实时生成结果直接显示在页面最顶端,里面那个方法名就是与上面所写的方法一致就行了。而且用户控件可以

使用此方法。

使用WriteSubstitution()方法有两个好处。
第一,WriteSubstitution()方法引用的方法并不一定是当前类的方法。该方法可以是另一个实例或者另一个类的静

态方法。
第二个好处是,可以在自定义控件中使用WriteSubstitution()方法来实现缓存后替换。

 

2。应用程序缓存
此部分内容请参看我的另外一篇文章:asp.net 的状态管理与cache,在这篇文章里我将应用程序缓存与缓存依赖一并讲了。

 

参考文章
ASP.NET缓存:方法和最佳实践
http://blog.csdn.net/jelink/archive/2006/09/11/1210241.aspx
ASP.NET缓存的SetSlidingExpiration
http://space.cnblogs.com/question/879/
即使 SetSlidingExpiration 方法设置为,也会收到新网页而不是缓存的网页的满足运行.NET Framework 2.0 的计

算机上
http://support.microsoft.com/kb/909643/zh-cn
ASP.NET 2.0的页面缓存功能介绍
http://dev.yesky.com/msdn/498/2442998_1.shtml
4.3  使用部分页面缓存
http://book.csdn.net/bookfiles/1002/100100230727.shtml

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics