ASP.NET缓存技术 第一讲

1 篇文章 0 订阅
1 篇文章 0 订阅

序言

        最近公司团队内部搞分享,我选择了我比较喜欢的数据缓存这部分来学习并分享,所以整理了一些资料,以便于更好的给大家讲解,下边就将我整理的东西分享给大家,里边有很多是搜集到的资料,在此向原作者们表示感谢!

       这个系列共有三讲,请关注第一讲,第二讲,第三讲。下边开始正文。

       有时候总听到同学说网站运行好慢,不知如何是好;有时候也总见到一些同学写的网站功能看起来非常好,但访问性能却极其的差。没有“勤俭节约”的意识,势必会造成“铺张浪费”。如何应对这种情况,充分利用系统缓存则是首要之道。

      系统缓存有什么好处呢?举个简单的例子,你想通过网页查询某些数据,而这些数据并非实时变化,或者变化的时间是有期限的。例如查询一些历史数据。那么每个用户每次查的数据都是一样的。如果不设置缓存,ASP.NET也会根据每个用户的请求重复查询n次,这就增加了不必要的开销。所以,可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大大提供应用程序的性能。毕竟现在内存非常便宜,用空间换取时间效率应该是非常划算的。尤其是对耗时比较长的、需要建立网络链接的数据库查询操作等。

        缓存功能是大型网站设计一个很重要的部分。由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能。

缓存的分类

    从分布上来看,我们可以概括为客户端缓存和服务器端缓存。如图所示:

 

 

客户端缓存—— 这点大家都有直观的印象。比如你去一个新的网站,第一次可能要花一阵子时间才能载入整个页面。而以后再去呢,时间就会大大的缩短,原因就在于这个客户端缓存。现在的浏览器都比较智能,它会在客户机器的硬盘上保留许多静态的文件,比如各种gif,jpeg文件等等。等以后再去的时候,它会尽量使用本地缓存里面的文件。只有服务器端的文件更新了,或是缓存里面的文件过期了,它才会再次从服务器端下载这些东西。很多时候是IE替我们做了这件事情。

 

服务器端缓存——有些东西没法或是不宜在客户端缓存,那么我们只好在服务器端想想办法了。服务器端缓存从性质上看,又可以分为静态文件缓存和动态缓存两种。

 

(1)静态文件缓存

   好多页面是静态的,很少改动,那么这种文件最适于作静态缓存。静态缓存再此不做讲解。

(2)动态缓存

    动态缓存是比较有难度的。因为你在缓存的时候要时刻注意一个问题,那就是缓存的内容是不是已经过时了。因为内容过时了可能会有很严重的后果。比如网上买卖股票的网站。你给别人提供的价格是过时的,那人家非砍了你不可。缓存如何发现自己是不是过时就是一个非常复杂的问题。

 在ASP.NET中,常见的动态缓存主要有以下几种手段:

l  传统缓存方式

l 页面输出缓存。

l  页面局部缓存。

l  利用.NET提供的System.Web.Caching 缓存。

l  缓存依赖。

页面输出缓存

页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中。当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期。在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期。通常情况下,页面输出缓存对于那些包含不需要经常修改内容的,但需要大量处理才能编译完成的页面特别有用。需要读者注意的是,页面输出缓存是将页面全部内容都保存在内存中,并用于完成客户端请求。

在ASP.NET中页面缓存的使用方法非常的简单,只需要在aspx页的顶部加这样一句声明即可:

 

 

<%@OutputCacheDuration="60"VaryByParam="none"%>

 

Duration 

缓存的时间(秒)。这是必选属性。如果未包含该属性,将出现分析器错误。

 

<%@PageLanguage="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm1" %>

<%@OutputCacheDuration="60" VaryByParam="none" %>

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

    <title>页面缓存示例</title>

</head>

<body>

    <formid="form1"runat="server">

    <div>

        <asp:LabelID="Label1"runat="server"Text="Label"></asp:Label>

    </div>

    </form>

</body>

 

</html>

 

 

       

后台代码:

       protected void Page_Load(object  sender,EventArgs e)

        {

            if  (!IsPostBack)

            {

                Label1.Text = DateTime.Now.ToString();

            }

 

        }

       

    如果不加<%@OutputCacheDuration="60"VaryByParam="none"%>,每次刷新页面上的时间每次都是在变。而加了缓存声明以后,每次刷新页面的时间并不变化,60秒后才变化一次,说明数据被缓存了60秒。

 VaryByParam

是指页面根据使用 POST 或 GET 发送的名称/值对(参数)来更新缓存的内容,多个参数用分号隔开。如果不希望根据任何参数来改变缓存内容,请将值设置为 none。如果希望通过所有的参数值改变都更新缓存,请将属性设置为星号 (*)。

例如:http://localhost:1288/Demo2.aspx?language=e
则可以在WebForm1.aspx页面头部声明缓存:<%@OutputCacheDuration="60"VaryByParam=" language" %>

以上代码设置页面缓存时间是60秒,并根据language参数的值来更新缓存,即language的值发生变化才更新缓存。

如果一直是Demo2.aspx?language=e访问该页,则页面会缓存当前数据,当language=c时又会执行后台代码更新缓存内容。

除此之外,@OutputCache还有一些其他的属性。@OutputCache指令中的属性参数描述如下:

 

<%@OutputCacheDuration="#ofseconds"

   Location="Any | Client | Downstream | Server | None |

     ServerAndClient "

   Shared="True | False"

   VaryByControl="controlname"

   VaryByCustom="browser | customstring"

   VaryByHeader="headers"

   VaryByParam="parametername"

   CacheProfile="cache profile name | ''"

   NoStore="true | false"

   SqlDependency="database/table name pair |  CommandNotification"

%>

 

 

CacheProfile

用于调用Web.config配置文件中设置的缓存时间。这是可选属性,默认值为空字符 ("")

例如:在Web.config中加入配置:

<system.web>

    <caching>

       <outputCacheSettings>

           <outputCacheProfiles>

               <addname="CacheTest"duration="50" />

           </outputCacheProfiles>

       </outputCacheSettings>

 </caching>

</system.web>

  

       

页面中声明:

%@OutputCacheCacheProfile="CacheTest" VaryByParam="none"%

 

注意:

包含在用户控件(.ascx文件)中的 @ OutputCache 指令不支持此属性。在页中指定此属性时,属性值必须与 outputCacheSettings 节下面的  outputCacheProfiles 元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

       如果每个页面的缓存时间相同,则不需要每个页面设置,而是通过统一一个地方控制,这样就可以更好的统一控制所有页面的缓存时间。如果想改变缓存时间,只需要改一下web.config的配置信息即可,而不用每个页面去修改。

VaryByControl

      通过控件文件中包含的服务器控件来改变缓存(值是控件ID,多控件用分号隔开)

在 ASP.NET页和用户控件上使用 @ OutputCache 指令时,需要该属性或 VaryByParam 属性。

 

<%@PageLanguage="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm2" %>

<%@OutputCacheDuration="60" VaryByParam="none" VaryByControl="DropDownList1" %>

 

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

    <title>根据控件页面缓存</title>

</head>

<body>

    <formid="form1"runat="server">

    <div>

         <%=DateTime.Now%>        

        <br>

    <asp:DropDownListID="DropDownList1"runat="server">

        <asp:ListItem>beijing</asp:ListItem>

        <asp:ListItem>shanghai</asp:ListItem>

        <asp:ListItem>guangzhou</asp:ListItem>

        </asp:DropDownList>

        <asp:ButtonID="Button1"runat="server"Text="提交"/>

    </div>

    </form>

</body>

 </html>

 

以上代码设置缓存有效期是60秒,并且页面不随任何GET或POST参数改变(即使不使用VaryByParam属性,但是仍然需要在@ OutputControl指令中显式声明该属性)。如果用户控件中包含ID属性为“DropDownList1”的服务器控件(例如下拉框控件),那么缓存将根据该控件的变化来更新页面数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值