应用程序数据缓存(即页面数据缓存)提供了一种编程方式,可通过键/值将任意数据存储在内存中,该缓存机制类似于Session。应用程序数据缓存的主要功能是在内存中存储各种与应用程序相关的对象。通常这些对象都需要耗费大量的服务器资源才能创建。因此,对这些对象实施缓存有着明显的益处。使用应用程序缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序数据缓存中的数据是容易丢失的,即数据并不是在整个应用程序生命周期中都存储在内存中。
应用程序数据缓存的优点是由ASP.NET管理缓存,它会在项过期、无效或内存不足时移除缓存中的项,还可以配置应用程序缓存,以便在移除项时通知应用程序。
在ASP.NET中使用Cache类实现应用程序数据缓存。Cache类可以通过使用键/值对的形式,对需要缓存的对象实施缓存,而且通过Cache类还可以设置缓存的有效期、依赖性和优先级等特性。
例如,向应用程序数据缓存添加一个新的缓存数据,代码如下:
Cache["Key"]=Value;
Cache类中的属性及其说明如表1所示。
表1 Cache类的属性及说明
属 性 |
说 明 |
Count |
获取存储在缓存中的项数 |
EffectivePrivateBytesLimit |
获取可用于缓存的千字节数 |
Item |
获取或设置指定键处的缓存项 |
Cache类中的方法及其说明如表1所示。
表1 Cache类的方法及说明
方 法 |
说 明 |
Add |
将指定项添加到Cache对象,该对象具有依赖项、过期和优先级策略以及一个委托 |
Equals |
确定两个Object实例是否相等 |
Get |
从Cache 对象检索指定项 |
GetEnumerator |
检索用于循环访问包含在缓存中的键设置及其值的字典枚举数 |
GetHashCode |
用作特定类型的哈希函数。GetHashCode适合在哈希算法和数据结构中使用 |
GetType |
获取当前实例的 Type |
Insert |
向Cache对象插入项。使用此方法的某一版本改写具有相同key参数的现有Cache项 |
ReferenceEquals |
确定指定的 Object 实例是否是相同的实例 |
Remove |
从应用程序的 Cache 对象移除指定项 |
ToString |
返回表示当前 Object 的 String |
下面对Cache类中的常用方法进行详细介绍。
(1)Add方法
Add方法在将数据添加到缓存的同时,还允许为应用程序数据缓存设置有效期、优先级、依赖项等特性。
语法如下。
public Object Add (
string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback
)
参数说明。
l key:用于引用该项的缓存键。
l value:要添加到缓存的项。
l dependencies:该项的文件依赖项或缓存键依赖项,当任何依赖项更改时,该对象即无效,并从缓存中移除,如果没有依赖项,则此参数可以设为Null。
l absoluteExpiration:过期的绝对时间。
l slidingExpiration:最后一次访问所添加对象时与该对象过期时之间的时间间隔。
l priority:缓存的优先级,由CacheItemPriority枚举表示。缓存的优先级共有6种,从大到小依次是NotRemoveable、High、AboveNormal、Normal、BelowNormal和Low。
l OnRemoveCallback:在从缓存中移除对象时所调用的委托(如果没有,可以为Null)。当从缓存中删除应用程序的对象时,它将会被调用。
例如,使用Add方法实现将数据对象添加到应用程序数据缓存中,代码如下:
Cache.Add("Key1", XMLTest, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero, CacheItemPriority.High, onRemove);
本段代码调用了Cache类的Add方法。该方法实现了将数据对象XMLTest添加到应用程序数据缓存中,其中关键名为Key1,缓存对象无依赖性,缓存有效期是10s,优先级为High,当缓存过期时调用onRemove方法。
注意:如果Cache中已保存了具有相同key参数的项,则对此方法的调用将失败。若要使用相同的key参数改写现有的Cache项,那么必须使用Insert方法。
(2)Insert方法
Insert方法声明与Add方法类似,但Insert方法为可重载方法。向Cache对象插入项。使用此方法的某一版本改写具有相同 key 参数的现有 Cache 项。
Insert方法的各重载方法的语法如下。
① 向 Cache 对象插入项,该项带有一个缓存键引用其位置,并使用CacheItemPriority枚举提供的默认值。
public void Insert (string key,Object value)
② 向 Cache 中插入具有文件依赖项或键依赖项的对象。
public void Insert (string key,Object value, CacheDependency dependencies)
③ 向 Cache 中插入具有依赖项和过期策略的对象。
public void Insert (string key,Object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration)
④ 向 Cache 对象中插入对象,后者具有依赖项、过期和优先级策略以及一个委托。
public void Insert (
string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback
)
Inert方法各重载方法中的参数的使用方法与Add方法基本一致,这里不再赘述了。
例如,只添加项的键和值代码如下:
Cache.Insert("Key1",XmlTest)
例如,缓存一些频繁使用的数据。如果数据一直被引用,则数据将在缓存中一直保留下去,除非数据未被引用的时间达到了一分钟。
Cache.Insert("key",myFrequentlyAccessedData,null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromMinutes(1));
(3)Get方法
该方法主要是根据键名获取被缓存的数据对象。
语法如下:
public Object Get (string key)
其中,参数key表示要检索的缓存项的标识符。该方法的返回值是Object类型。在使用时需要注意类型的转换问题。
例如,检索Key值为“key1”的缓存值,代码如下:
Cache.Get("Key1");
(4)GetEnumerator方法
该方法主要用于返回一个IdictionaryEnumerator对象,该对象可用于循环访问包含在缓存中的键设置及其值的字典枚举数。此方法在枚举所有项的同时,可以将项添加到缓存或从缓存移除项。
语法如下:
public IDictionaryEnumerator GetEnumerator ()
该方法返回了一个IDictionaryEnumerator对象。开发人员可以使用该对象对缓存中的对象进行枚举操作,并且,显示对缓存对象的操作。
例如,使用GetEnumerator方法创建一个IDictionaryEnumerator对象CacheEnumTest。枚举数在整个缓存中运行一遍,将各缓存项的值转换成字符串,然后将这些值在Web页中输出,代码如下:
IDictionaryEnumerator CacheEnumTest = Cache.GetEnumerator();
while (CacheEnumTest.MoveNext())
{
cacheItem = Server.HtmlEncode(CacheEnumTest.Current.ToString());
Response.Write(CacheEnumTest);
}
(5)Remove方法
使用Remove方法可以显示移除缓存对象,可以在事件处理程序中,使用该方法来响应用户输入或来自应用程序的一些其他输入。
语法如下:
public Object Remove (string key)
其中,参数key表示要移除的缓存项的标识符。
例如,移除键名为“Key1”的缓存项,代码如下:
if(Cache["Key1"] != null)
Cache.Remove("Key1");
示例:
页面数据缓存的应用
本示例演示如何利用Cache类实现应用程序数据缓存管理,包括添加、检索和删除应用程序数据缓存对象的方法。执行程序,并依次单击“添加”和“检索”按钮,示例运行结果如图1所示。
图1 页面数据缓存的应用
程序实现的主要步骤如下。
(1)新建一个网站,默认主页为Default.aspx。首先在该页中添加3个Button按钮,分别用于执行添加数据缓存信息、检索数据缓存信息和移除数据缓存信息;然后,再添加一个GridView控件用于显示数据信息;最后添加两个Label控件,分别用于显示缓存对象的个数和对缓存对象操作的信息。
(2)当用户单击“添加”按钮时,首先将数据库中的数据表读取到DataSet中,然后,判断缓存中是否存在该数据,如果不存在,则将数据信息添加到缓存中。“添加”按钮的Click事件代码如下:
//添加按钮,用于将数据信息保存在缓存中
protected void Button3_Click(object sender, EventArgs e)
{
//将数据信息添加到缓存中
SqlConnection conn = new SqlConnection("Server=MRLFL//MRLFL;uid=sa;pwd=;database=db_21");
conn.Open();
SqlDataAdapter da = new SqlDataAdapter("select * from tb_StuInfo", conn);
DataSet ds = new DataSet();
da.Fill(ds, "student");
if (Cache["key"] == null)
{
Cache.Insert("key", ds);
}
this.Label2.Text = "";
DisplayCacheInfo();
}
(3)当用户单击“检索”按钮时,从缓存中检索指定的数据信息是否存在,并将检索的结果绑定到GridView控件中。“检索”按钮的Click事件代码如下:
//检索按钮,用于从缓存中检索指定的数据信息是否存在
protected void Button2_Click(object sender, EventArgs e)
{
if (Cache["key"] != null)
{
this.Label2.Text = "已检索到缓存中包括该数据!";
this.GridView1.DataSource = (DataSet)Cache["key"];
this.GridView1.DataBind();
}
else
{
this.Label2.Text = "未检索到缓存中包括该数据!";
this.GridView1.DataSource = null;
this.GridView1.DataBind();
}
DisplayCacheInfo();
}
(4)当用户单击“移除”按钮时,首先从缓存中判断指定的数据信息是否存在,如果存在,则从缓存中将指定的数据信息移除,“移除”按钮的Click事件代码如下:
//移除按钮,用于从缓存中移除指定的数据信息
protected void Button1_Click(object sender, EventArgs e)
{
if (Cache["key"] == null)
{
this.Label2.Text = "未缓存该数据,无法删除!";
}
else
{
Cache.Remove("key");
this.Label2.Text = "删除成功!";
}
if (Cache["key"] == null)
{
this.GridView1.DataSource = null;
this.GridView1.DataBind();
}
DisplayCacheInfo();
}
程序完整代码如下:
★★★★★Default.aspx.cs代码文件的代码★★★★★
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Caching;
using System.Data.SqlClient;
using System.Xml;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void DisplayCacheInfo()
{
string cacheCount = Cache.Count.ToString();
this.Label1.Text = "共包括"+cacheCount+"个缓存对象:";
IDictionaryEnumerator cacheEnum = Cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
this.Label1.Text+= cacheEnum.Key.ToString();
}
}
//添加按钮,用于将数据信息保存在缓存中
protected void Button3_Click(object sender, EventArgs e)
{
//将数据信息添加到缓存中
SqlConnection conn = new SqlConnection("Server=a//mr;uid=sa;pwd=;database=db_21");
conn.Open();
SqlDataAdapter da = new SqlDataAdapter("select * from tb_StuInfo", conn);
DataSet ds = new DataSet();
da.Fill(ds, "student");
if (Cache["key"] == null)
{
Cache.Insert("key", ds);
}
this.Label2.Text = "";
DisplayCacheInfo();
}
//检索按钮,用于从缓存中检索指定的数据信息是否存在
protected void Button2_Click(object sender, EventArgs e)
{
if (Cache["key"] != null)
{
this.Label2.Text = "已检索到缓存中包括该数据!";
this.GridView1.DataSource = (DataSet)Cache["key"];
this.GridView1.DataBind();
}
else
{
this.Label2.Text = "未检索到缓存中包括该数据!";
this.GridView1.DataSource = null;
this.GridView1.DataBind();
}
DisplayCacheInfo();
}
//移除按钮,用于从缓存中移除指定的数据信息
protected void Button1_Click(object sender, EventArgs e)
{
if (Cache["key"] == null)
{
this.Label2.Text = "未缓存该数据,无法删除!";
}
else
{
Cache.Remove("key");
this.Label2.Text = "删除成功!";
}
if (Cache["key"] == null)
{
this.GridView1.DataSource = null;
this.GridView1.DataBind();
}
DisplayCacheInfo();
}
}
★★★★★Default.aspx设计文件的代码★★★★★
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
body:{margin-top:0px;}
页面数据缓存的应用 BorderWidth="2px" CellPadding="3" GridLines="None" BorderStyle="Ridge" CellSpacing="1">
★★★★★web.config网站配置文件的代码★★★★★