缓存与异步访问
ASP.NET有两种类型的缓存机制,一种是输出缓存,一种是应用程序缓存。
输出缓存(Ouput caching):输出缓存是一种简单的缓存机制,它将输出到客户端的HTTP页面进行缓存,当其他用户继 续请求页时,服务器端直接从内存中取出缓存页面,而不是重新历经一遍ASP.NET页面的生存周期。页输出缓存对于那些不需要经常修改,但需要大量处理才能创建的页面特别有效。输出缓存最终输出的为HTML内容,能够提供最大的性能增强。
数据缓存(Data caching):数据缓存又称应用程序缓存,它需要手工编写代码来实现。比如可以将一个动态的Dataset对象添加到一个缓存对象中,后继的用户在使用该对象时,可以判断缓存中是否存在缓存对象,如果存在则直接使用缓存对象,否则的话创建一个新的缓存对象。
输出缓存又分为两种:
1.整页缓存:这种方式将页的所有内容都保存在内存中,客户端请求时返回整个页面的缓存。
2.部分页缓存:又称分段缓存,同理,只缓存页的部分内容。
最基本的缓存示例
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依赖和文件依赖