缓存是个啥?以及为啥要用缓存就不废话了,主要是从实用角度讲下怎么用
1.先添加对Microsoft.Practices.EnterpriseLibrary.Caching.dll的引用
2.修改web.config文件,注意高度部分
<configSections>
...
<section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral" />
...
</configSections>
<cachingConfiguration defaultCacheManager="Cache Manager">
<cacheManagers>
<add expirationPollFrequencyInSeconds="60" maximumElementsInCacheBeforeScavenging="1000"
numberToRemoveWhenScavenging="10" backingStoreName="Null Storage"
type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral"
name="Cache Manager" />
</cacheManagers>
<backingStores>
<add encryptionProviderName="" type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral"
name="Null Storage" />
</backingStores>
</cachingConfiguration>
...
3.使用缓存,见下面的代码,关键地方都加了注释
using System.Collections.Generic;
using Microsoft.Practices.EnterpriseLibrary.Caching;
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
namespace CacheTest
{
/// <summary>
/// 定义要缓存的实体类
/// </summary>
public class MyData
{
public string Name { set ; get ; }
public int Age { set ; get ; }
public string Color { set ; get ; }
}
public partial class _Default : System.Web.UI.Page
{
const string KEYNAME = " myDate " ; // 缓存的键值
ICacheManager cacheManager;
protected void Page_Load( object sender, EventArgs e)
{
cacheManager = CacheFactory.GetCacheManager(); // 实例化ICachemanager
}
protected void btnWrite_Click( object sender, EventArgs e)
{
// 生成要缓存的数据(实际开发中可以是从数据库查询出来的数据)
List < MyData > _list = new List < MyData > {
new MyData(){ Age = 1 , Color = " Yellow " , Name = " China " },
new MyData{ Age = 2 ,Color = " Black " ,Name = " USA " }
};
AbsoluteTime _ExpireTime = new AbsoluteTime(DateTime.Now.AddSeconds( 30 )); // 指定30秒后过期
cacheManager.Add(KEYNAME, _list, CacheItemPriority.Normal, null , _ExpireTime); // 加入缓存
Response.Write( " Cache写入完成, " + DateTime.Now.ToString());
}
protected void btnRead_Click( object sender, EventArgs e)
{
this .R1.DataSource = GetCacheData();
this .R1.DataBind();
Response.Write( " Cache加载完成, " + DateTime.Now.ToString());
}
/// <summary>
/// 获取缓存数据
/// </summary>
/// <returns></returns>
public List < MyData > GetCacheData()
{
List < MyData > _cacheData = cacheManager.GetData(KEYNAME) as List < MyData > ;
if ( null == _cacheData) // 记得一定要加此判断(因为缓存可能过期)
{
// 如果缓存数据为空,则重新生成数据,并加入缓存(为检测效果,特地把Color与Name前加了一个"New")
_cacheData = new List < MyData > {
new MyData(){ Age = 1 , Color = " New Yellow " , Name = " New China " },
new MyData{ Age = 2 ,Color = " New Black " ,Name = " New USA " }
};
AbsoluteTime _ExpireTime = new AbsoluteTime(DateTime.Now.AddSeconds( 30 )); // 指定30秒后过期
cacheManager.Add(KEYNAME, _cacheData, CacheItemPriority.Normal, null , _ExpireTime);
}
return _cacheData;
}
}
}
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title ></ title >
</ head >
< body >
< form id ="form1" runat ="server" >
< asp:Button ID ="btnWrite" runat ="server" Text ="Write Cache" OnClick ="btnWrite_Click" />
< asp:Button ID ="btnRead" runat ="server" Text ="Load Cache"
onclick ="btnRead_Click" />
< asp:Repeater ID ="R1" runat ="server" EnableViewState ="false" >
< HeaderTemplate >
< ul >
</ HeaderTemplate >
< ItemTemplate >
< li > Age: <% # Eval ( " Age " ) %> ,Name: <% # Eval ( " Name " ) %> ,Color: <% # Eval ( " Color " ) %> </ li >
</ ItemTemplate >
< FooterTemplate >
</ ul >
</ FooterTemplate >
</ asp:Repeater >
</ form >
</ body >
</ html >
值得一提的是,缓存是"全局"性质的,也就是说在一个页面写入了缓存,另一个页面也可以读取(当然:前提是缓存未过期的情况下),我们可以利用这个特性把网站中经常使用的数据(比如一些基础数据)缓存起来,其它要用的地方直接从缓存读取,能有效减少对数据库的访问。