关于缓存

最近小组内部在搞学习分享,每周都会有小组成员进行内部分享学习心得。本周我的分享是关于缓存的。关于缓存,我们很容易可以理解为在一定时间内保存在页面中的信息。

通常,页面中的数据保存在内存中,当服务器发出请求后,系统会把缓存中的数据输出到页面中,这个过程会一直持续到页面缓存过期为止。设置缓存的好处是可以减少客户端对服务器发请求的压力,缩短服务器的响应时间,对于没有频繁进行数据更新和交换的页面来说,缓存可以很好的提高性能。但是,相对于需要频繁发生数据更新和交换的页面来说,缓存则不是好的选择。

如何设置缓存呢?对于ASP.NET  2.0可以通过使用<%@ OutputCache Duration="10" VaryByParam ="None" %>的指令来设置缓存的一些信息。

<%@ OutputCache  %>指令一共有10个属性,主要如下:CacheProfile、NoStore、Duration、Shared、Location、SqlDependency、VaryByControl、VaryByCustom、VaryByHeader和VaryByParam。

  (1)CacheProfile:用于定义与该页关联的缓存设置的名称。是可选属性,默认值为空字符("")。

  (2)NoStore:该属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。

  (3)Duration:用于设置页面或者用户控件缓存的时间。单位是秒。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。

  (4)Shared:该属性定义一个布尔值,用于确定用户控件输出是否可以由多个页共享。默认值为false。

  (5)Location:用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、Server和ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。

  (6)SqlDependency:该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。

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

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

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

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

 

说完上面一大堆的属性,目前用到比较多的有两个属性:DurationVaryByParam。这两个属性是什么意思呢?Duration表示设置的缓存时间,VaryByParam属性中none表示页面的缓存策略不随页面的任何的GET或者POST参数而改变。例子如下:

 1 <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="CacheTest._Default" %>
 2 <%@ OutputCache Duration="10" VaryByParam ="None" %>
 3 
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 5 
 6 <html xmlns="http://www.w3.org/1999/xhtml" >
 7 <head runat="server">
 8     <title>测试页面输出缓存实验</title>    
 9 </head>
10 <body>
11     <center>
12         <h2><font face="Verdana">测试页面输出缓存实验</font></h2>
13         <p></p>
14         <p>页面生成时间:<%=DateTime.Now.ToString()%></p>
15         <p><a href="Default.aspx">回到首页</a></p>
16         <p><a href="<%=Request.RawUrl %>">刷新页面</a></p>
17     </center>
18 </body>
19 </html>
点击展开代码

 VaryByParam属性中如果设置了值,可以用分号分割,那么页面的缓存策略则会根据参数来设置输出的缓存。例子如下:

 1 <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="CacheTest._Default" %>
 2 <%@ OutputCache Duration="10" VaryByParam ="UserCode" %>
 3 
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 5 
 6 <html xmlns="http://www.w3.org/1999/xhtml" >
 7 <head runat="server">
 8     <title>测试页面输出缓存实验</title>    
 9 </head>
10 <body>
11     <center>
12         <h2><font face="Verdana">测试页面输出缓存实验</font></h2>
13         <p></p>
14         <p>页面生成时间:<%=DateTime.Now.ToString()%></p>
15         <p><a href="Default.aspx">回到首页</a></p>
16         <p><a href="<%=Request.RawUrl %>">刷新页面</a></p>
17     </center>
18 </body>
19 </html>
点击展开代码

 

属性说完了,现在真正开始用例子来演示一下页面的缓存机制。

 在页面中,设置了一个链接来刷新页面,首先我在页面中设置了缓存,如下设置:

然后点击页面中的刷新页面的链接,这时候,用Fiddler去跟踪页面,发现只有当缓存时间过了以后才会请求服务器。这说明了什么?缓存只有在过期了以后,页面才会向服务器发送请求,否则会使用内存中缓存数据展示在页面中。

所以说:缓存对于服务器来说会减少请求,对程序的性能有很好的维护,当然,前提是对于不是频繁更新数据的系统。

 

通过代码实现缓存:

1 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
2 
3         Response.Cache.SetCacheability(HttpCacheability.Public)
4         '设置绝对时间和日期
5         Response.Cache.SetExpires(DateTime.Now.AddSeconds(10))
6 
7     End Sub
点击展开代码

 

客户端强制刷新页面的时候,缓存就不会起作用了。

 那么就来说说F5与Ctrl+F5的区别。

浏览器中,按住F5键和点击浏览器的刷新其实是一样的,而Ctrl+F5是强制刷新页面。

当我们去访问一个页面的时候,浏览器会缓存这个页面中静态文件。然后,当我们再去访问这个页面的时候,浏览器在缓存期间,会直接把本地缓存的文件显示在页面中,而不会去请求服务器。

Ctrl+F5就是跳过缓存,直接访问服务器,然后从服务器去down一份全新的资源到页面中。

 

 

 

 

 

 

posted @ 2013-08-28 23:55  毛毛大王  阅读(375)  评论(0编辑  收藏  举报