对缓冲(caching)技术的一些学习总结

缓冲(caching)技术在网络应用程序中的作用非常重要,因为目前的技术大多在客户端浏览器发出请求后,动态的生成一些静态的网页然后传回客户浏览器,这种动态生成技术使得程序对网站服务器的性能要求较高,尤其是要生成一些复杂的网页或频繁生成的相同网页时,问题显得更加严重,于是就有了缓冲技术的出现,它将动态生成的静态网页保存起来,当客户端有相同的请求时就直接将已保存的网页发送过去,大大的提高了浏览速度和工作效率,而ASP.NET就是通过将这些缓冲的内容存储在内存中以获得更快的读取速度,即在内存汇总开辟了程序缓冲区。
8.5.1    ASP.NET缓冲方式(三种:页面输出、页面部分、数据缓冲)
ASP.NET技术中,有三个缓冲的方法:页面输出、页面部分、页面数据。这三种方法各有特点,页面输出提供了对于请求的动态反映,一般存放完整的浏览页。当有客户端请求时,它直接将缓冲区中的页面传给浏览器,这样省掉了大量的代码执行时间,提高了运行效率。
如果将整个网页放入缓冲区不太现实,我们也可以采用页面部分缓冲的办法,它是将网页中复杂的、难以生成的放入缓冲区,提供给不同的请求使用,对于那些必须动态生成的部分单独处理,从而减少了要执行的代码的数量。
数据缓冲是将对象放入内存缓冲区中,由ASP.NET提供的一系列的类、属性和方法来控制这些缓冲区内的对象。
下面就让我们来详细认识这几种缓冲技术:
(1)页面输出
页面输出缓冲是通过保存已生成的动态网页来提高请求和反应能力,它是默认允许的,但对于已经指定的响应,输出是不进行缓冲的,除非是有直接的代码说明为响应提供输入缓冲。
若要提供输出缓冲,则需指定缓冲区中内容的有效期和建立有访问权限的公有缓冲,这个可以通过OutputCache API实现或使用@OutputCache指令来完成,当缓冲区建立后,第一次的GET请求会为缓冲区开辟一个入口,后面的GET或HEAD请求都会利用这个入口并行地利用页面输入缓冲数据。
页面输入是通过有效期来管理缓冲区内中的页面的。如果有一个页面在缓冲区内被标记了有效期,有效期是30分钟,那么当这个页面的停留时间超过30分钟时,就会被自动清理出缓冲区,若再有对于这个页面的请求,那么这个页面的缓冲页面会被重新创建,标记上新的有效期,记住:这个有效期是绝对的有效期,也就是页面的实际保留时间。
有效期的声明方法一如下:
<%@ OutputCache Duration=”60” VaryByParam=”none” %>
其中“Duration”的计量单位是秒,“VaryByParam”表示页面是否会因为指令而改变。
有效期的声明方法二如下:
Response.Cache.SetExpires (DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability (HttpCacheability.Public);
这是通过类HttpCachePolicy的方法来设定有效期的,其中SetExpires方法是用来确定有效期的时间,而SetCacheability 方法表示文档在网络中的缓冲方式,其参数是枚举型的,取值有四种(Server、Public、Private、NoCache),Private是默认值,指明请求的响应在客户端,Public说明响应在客户端和代理服务器都是可以缓冲的,Serve表示只能在最初的服务器缓冲,而NoCache表示不缓冲。
(2)页面部分
当将这个页面放入缓冲区变得不太可能时,我们就可以使用ASP.NET的另一个缓冲的方法 —— 页面部分缓冲。其实,页面部分缓冲也能看作是页面输出缓冲的一种,如果要使用页面部分缓冲,则需要在页面中使用user control来说明需要缓冲的部分,即将缓冲部分和网页进行分离,然后使用@OutputCache指令进行标记,确定起有效期等属性。
@OutputCache有以下几个重要属性:
    a)    Duration:以秒为单位,用来指定有效期的时间。
     b)    Location:取值是枚举型的,有ANY、 Client、Downstream、Server和None五种取值,“Server”表示输出缓冲定位于处理请求的服务器,“Client”表示定位于发送请求的客户端浏览器,“Downstream”表示输出缓冲定位于处理请求的服务器的下传流,“ANY”则表示这三种情况都是允许的,而 “None”表示不使用输出缓冲。
    c)    VaryByHeader:根据http头信息来改变缓冲区内容。
     d)    VaryByCustom:有两种取值类型,一种是 “browser”,表示根据浏览器的名字和版本信息改变缓冲区内容,另一种是自定义字符串,它必须要在Global.asax文档中重定义 HttpApplication的GetVaryByCustomString方法。
    e)    VaryByParam:使用一个用分号间隔的字符串来改变输出缓冲,一般为对应于GET方法的查询字符串或POST方法的参数。
    f)    VaryByControl:使用字符串来改变输出缓冲的内容,它不支持ASP.NET页面的@OutputCache指令。
(3)数据缓冲
数据缓冲是一种强大而又非常简单的缓冲机制,它可以在缓冲区中为每个应用程序保存各种对象,这些对象可以根据http的请求被调用,但是在各个不同的应用程序中这些对象都是私有的。
数据缓冲是通过Cache类来实现的。当应用程序建立时,一个Cache类就同时被建立,缓冲实例的生存周期就是应用程序的生存周期,它会随着应用程序的重新运行而重建,通过Cache类的方法,我们可以将数据对象放入缓冲区,然后通过关键字匹配寻找并使用这些对象。
Cache类通过一个借口来控制所有需要缓冲的内容,包括规定缓冲的时间和缓冲方式,可以通过如下方法添加缓冲对象:
Cache[“关键字”] = 关键字的取值;
然后通过下面的方法来访问这个对象:
string mKeyValue = “”;
if(Cache[“关键字”] != null)
{
    mKeyValue = Cache[“关键字”];
}
在目前的ASP.NET的应用程序中,主要有以下三种数据缓冲的方法:
a)    垃圾清理
这种方式一般用于系统的资源比较紧张时,通过将不重要的和不常用的垃圾数据清理出缓冲区,释放系统资源,提高运行效率。使用这种方法需要在将数据放入缓冲区时,为这些数据标记优先级和必需的访问频率,当需要做垃圾清理时,可以根据数据的优先级来判断哪些是不重要的内容,然后根据访问频率来判断哪些是不常用的内容,最后将这些数据清理出内存缓冲区。
指定数据优先级和访问频率可以通过下面的方法来进行:
Cache.Insert(“String”,Example,null,DateTime.Now.AddSeconds(20), TimeSpan.Zero,CacheItemPriority.AboveNormal,CacheItemPriorityDecay. Slow,onRemove);
其中CacheItemPriority.AboveNormal是一个枚举型的数值,表示优先级,它的取值共有 6种,从小到大依次是:Low、BelowNormal、Normal、AboveNormal、High和NotRemoveable,默认值是 Normal。
CacheItemPriorityDecay.Slow表示访问频率,也是一个枚举型的数值,它的取值共有4种,依次是:Fast、Medium、Slow和Never,标为Fast表示最容易被清理出缓冲区。
b)    有效期
有效期指放入缓冲区的数据的保存时间,如上面例子所示,在进行Insert方法时,为缓冲数据添加了有效期。
DateTime指定了有效期的时间,可以是绝对时间,如“10:10”,也可以是相对时间,如创建后的30秒,TimeSpan指定了创建数据的时间间隔,如TimeSpan.Zero。
c)    关键字匹配
关键字匹配是指根据外部文件、目录或其他缓冲内容来确定缓冲内容的一种方式,这种方法可以有效的更新缓冲区的内容,尤其是当缓冲内容的数据源被修改时,可以使用这种方法来更新缓冲内容,将修改前的原始数据作为无效数据清理出内存。
8.5.2    ASP.NET缓冲编程
现在让我们结合一个实例来具体讲解对于缓冲的一些编程方法,具体实例代码如下:
WebForm2.aspx
<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup= "false" Inherits="Webtest.WebForm2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>WebForm1</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <FONT face="宋体">
                <TABLE id="Table1" style="Z-INDEX: 101; LEFT: 8px; WIDTH: 368px; POSITION: absolute; TOP: 8px; HEIGHT: 255px" cellSpacing="0" cellPadding="0" width="368" border="0">
                    <TR>
                        <TD align="middle" colSpan="2">
                            <asp:Label id="lblTitle" runat="server" Font-Size="9pt">新增图书</asp:Label></TD>
                    </TR>
                    <TR>
                        <TD style="WIDTH: 142px" align="right">
                            <asp:Label id="lblBookName" runat="server" Font-Size="9pt">图书名:</asp:Label></TD>
                        <TD>
                            <asp:TextBox id="txtBookName" runat="server"></asp:TextBox></TD>
                    </TR>
                    <TR>
                        <TD style="WIDTH: 142px" align="right">
                            <asp:Label id="lblAuthors" runat="server" Font-Size="9pt">作者名:</asp:Label></TD>
                        <TD>
                            <asp:TextBox id="txtAuthors" runat="server"></asp:TextBox></TD>
                    </TR>
                    <TR>
                        <TD style="WIDTH: 142px" align="right">
                            <asp:Label id="lblPublisher" runat="server" Font-Size="9pt">出版社:</asp:Label></TD>
                        <TD>
                            <asp:TextBox id="txtPublisher" runat="server"></asp:TextBox></TD>
                    </TR>
                    <TR>
                        <TD style="WIDTH: 142px"></TD>
                        <TD>
                            <asp:Button id="cmdAdd" runat="server" Text="增 加"></asp:Button></TD>
                    </TR>
                    <TR>
                        <TD vAlign="top" align="middle" colSpan="2">
                            <asp:DataGrid id="dgBooks" runat="server" BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="4" Height="117px">
                                <SelectedItemStyle Font-Bold="True" ForeColor="#663399" BackColor="#FFCC66"></SelectedItemStyle>
                                <ItemStyle ForeColor="#330099" BackColor="White"></ItemStyle>
                                <HeaderStyle Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000"></HeaderStyle>
                                <FooterStyle ForeColor="#330099" BackColor="#FFFFCC"></FooterStyle>
                                <PagerStyle HorizontalAlign="Center" ForeColor="#330099" BackColor="#FFFFCC"></PagerStyle>
                            </asp:DataGrid></TD>
                    </TR>
                </TABLE>
            </FONT>
        </form>
    </body>
</HTML>
    
    WebForm2.aspx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Webtest
{
    /// <summary>
    /// WebForm2 的摘要说明。
    /// </summary>
    public class WebForm2 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.TextBox txtBookName;
        protected System.Web.UI.WebControls.TextBox txtAuthors;
        protected System.Web.UI.WebControls.TextBox txtPublisher;
        protected System.Web.UI.WebControls.Label lblTitle;
        protected System.Web.UI.WebControls.Label lblBookName;
        protected System.Web.UI.WebControls.Label lblAuthors;
        protected System.Web.UI.WebControls.Label lblPublisher;
        protected System.Web.UI.WebControls.Button cmdAdd;
        protected System.Web.UI.WebControls.DataGrid dgBooks;
    
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                this.LoadBook();
            }
        }

        #region Web Form Designer generated code
        override protected void _disibledevent= mDT.DefaultView;
            this.dgBooks.DataBind();
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值