缓存与异步访问

ASP.NET有两种类型的缓存机制,一种是输出缓存,一种是应用程序缓存。

输出缓存(Ouput caching):输出缓存是一种简单的缓存机制,它将输出到客户端的HTTP页面进行缓存,当其他用户继  续请求页时,服务器端直接从内存中取出缓存页面,而不是重新历经一遍ASP.NET页面的生存周期。页输出缓存对于那些不需要经常修改,但需要大量处理才能创建的页面特别有效。输出缓存最终输出的为HTML内容,能够提供最大的性能增强。

数据缓存(Data caching):数据缓存又称应用程序缓存,它需要手工编写代码来实现。比如可以将一个动态的Dataset对象添加到一个缓存对象中,后继的用户在使用该对象时,可以判断缓存中是否存在缓存对象,如果存在则直接使用缓存对象,否则的话创建一个新的缓存对象。

输出缓存又分为两种:

1.整页缓存:这种方式将页的所有内容都保存在内存中,客户端请求时返回整个页面的缓存。

2.部分页缓存:又称分段缓存,同理,只缓存页的部分内容。

最基本的缓存示例

<%@ OutputCache Duration="10" VaryByParam="None" %>

 

 

Duration="10",表示当前要缓存的时间,这里设置为10秒,会看到10秒内页面不会有变化,而10秒后才会变化。

VaryByParam属性指定缓存查询字符串的页面,也能的值包括"None","*"以及任何有效的查询字符串或POST参数名。

这里演示一个简单的示例,演示主从表的缓存,主页显示商品标题,从页显示对应商品的详细信息,缓存商品ID,新建两个页面,一个为MasterProduct.aspx和DetailsPage.aspx,在DetailsPage页面上添加如下声明:

指定缓存时间为一天,指定Product_ID为查询字符串,当Product_ID不同时,ASP,NET则会创建不同版本的DetailsPage.aspx页面,当不同的用户使用相同的查询字符串时,将从缓存中读取详细信息进行显示。

使用缓存配置:如果在多个页面需要用到相同的缓存配置,则可以在Web.config文件中统一添加缓存配置。
<configuration>
<sysytem.web>
 <caching>
   <outputCacheSettings>
     <!--缓存产品一小时-->
     <add name="ProductCache" duration="3600" varyByParam="None"/>
     <!--根据浏览器配置缓存-->
     <add name="browserCache" duration="5000" varyByCustom="browser"/>
   </outputCacheSettings>
 </caching>
</system.web>
</configuration>
这样就添加了两个ASP.NET缓存,再要使用缓存的页面就可以直接引用了
<%@ OutputCache CacheProfile="ProductCache" %>

2.缓存数据
Cache类位于System.Web.Caching命名空间中
Cache对象具有如下特点
(1)Cache对象是线程安全的,再编写多线程应用时不需要显式的加锁或解锁对象
(2)Cache中的对象如果过期,则会被自动移除,因此在Cache对象中获取数据的时候,需要判断是否存在该对象
(3)Cache对象支持缓存依赖,可以将Cache对象与一个文件,一个数据库表或者其他任何类型的资源相关联,如果发生改变,Cache对象可以自动的被移除或更新

Cache对象的使用应使用键值对的形式来保存
Cache["key"]=item;

实例如下:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            //首先从Cahce中获取DataSet
            DataSet productds = (DataSet)Cache["Products"];
            //判断Cache中是否存在DataSet,如果不存在,则从数据库中获取DataSet
            if (productds == null)
            {
                productds = GetProductDataSet();
                Cache.Insert("Products", productds, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(1));
            }
            this.GridView1.DataSource = productds;
            this.GridView1.DataBind();
        }
    }

    //从数据库中获取产品信息,并返回DataSet对象
    protected DataSet GetProductDataSet()
    {
        string connstr = ConfigurationManager .ConnectionStrings["SqlConn"].ConnectionString;
        DataSet ds = new DataSet();
        using (SqlConnection conn = new SqlConnection(connstr))
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from Products", conn);
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            sda.Fill(ds,"temp");
        }
        return ds;
    }
}

3.缓存依赖
使用缓存依赖,可以让缓存与外部文件相关联,挡外部资源发生更改时,缓存能够自动的被移除。
ASP.NET包括三种缓存依赖类
CacheDependency:允许基于文件或其它缓存键创建依赖
SqlCacheDependency:基于SqlServer的表或者是一个SqlServer查询的依赖
AggregateCahceDepency:基于多个缓存依赖项的依赖,比如可以同时组合SQL依赖和文件依赖

 

 

 

posted @ 2009-04-08 14:16  HeavenSUN  阅读(423)  评论(0编辑  收藏  举报