ASP.NET/Cache
< ASP.NET
Cache对象用于在HTTP request间保存页面或数据。以极大地提高整个应用程序的效率。常用于将频繁访问的大量服务器资源存储在内存中,当用户发出相同的请求后服务器不再次处理而是将Cache中保存的信息返回给用户,节省了服务器处理请求的时间。其生存期是应用程序的生存期。当重新启动应用程序时,将重新创建Cache对象实例。
Application本身就不是线程安全的,而Cache就是线程安全。
System.Web.Caching.Cache类使用比较多的方法和属性。
- Add()方法,将指定的对象添加到Cache对象集合中。
- Insert()方法将覆盖有相同Key的Cache顶。
- Remove()从应用程序的Cache对象中移除指定项。
- Count属性,获取存储在缓存中对象数。
要从Cache中获取一个缓存项,我们可以调用Cache.Get(key)方法,要将一个对象放入缓存,我们可以调用Add, Insert方法。想简单地放入缓存,一切接受默认值,那么还可以调用它的默认索引器
public Object Add(
string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback
)
参数:
- key 用于引用该项的缓存键。
- value 要添加到缓存的项。
- dependencies 该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数包含 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。
- absoluteExpiration 所添加对象将到期并被从缓存中移除的时间。如果使用可调到期,则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。
- slidingExpiration 最后一次访问所添加对象时与该对象到期时之间的时间间隔。如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并从缓存中移除。如果使用绝对到期,则 slidingExpiration 参数必须为 NoSlidingExpiration。
- priority 对象的相对成本,由 CacheItemPriority 枚举表示。缓存在退出对象时使用该值;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。
- onRemoveCallback 在从缓存中移除对象时所调用的委托(如果提供)。当从缓存中删除应用程序的对象时,可使用它来通知应用程序。
备注
- 如果 Cache 中已保存了具有相同 key 参数的项,则对此方法的调用将失败。若要使用相同的 key 参数覆盖现有的 Cache 项,请使用 Insert 方法。
- 无法同时设置 absoluteExpiration 和 slidingExpiration 参数。如果要让缓存项在特定时间到期,可将 absoluteExpiration 参数设置为特定时间,并将 slidingExpiration 参数设置为 NoSlidingExpiration。
- 如果要让缓存项在最后一次访问该项后的某段时间之后到期,可将 slidingExpiration 参数设置为到期间隔,并将 absoluteExpiration 参数设置为 NoAbsoluteExpiration。
ASP.NET为了方便访问Cache,在HttpRuntime类中加了一个静态属性Cache,可以在任意地方使用Cache的功能。 ASP.NET还给它增加了二个“快捷方式”:Page.Cache, HttpContext.Cache,通过这二个对象也可以访问到HttpRuntime.Cache, 注意:这三者是在访问同一个对象。
// 实现用于 Web 应用程序的缓存。无法继承此类。
public sealed class Cache : IEnumerable
{
// 用于 Cache.Insert(...) 方法调用中的 absoluteExpiration 参数中以指示项从不过期。
public static readonly DateTime NoAbsoluteExpiration;
// 用作 Cache.Insert(...) 或 Cache.Add(...)
// 方法调用中的 slidingExpiration 参数,以禁用可调过期。
public static readonly TimeSpan NoSlidingExpiration;
// 获取或设置指定键处的缓存项。
public object this[string key] { get; set; }
// 将指定项添加到 System.Web.Caching.Cache 对象,该对象具有依赖项、过期和优先级策略
// 以及一个委托(可用于在从 Cache 移除插入项时通知应用程序)。
public object Add(string key, object value, CacheDependency dependencies,
DateTime absoluteExpiration, TimeSpan slidingExpiration,
CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
// 从 System.Web.Caching.Cache 对象检索指定项。
// key: 要检索的缓存项的标识符。
// 返回结果: 检索到的缓存项,未找到该键时为 null。
public object Get(string key);
public void Insert(string key, object value);
public void Insert(string key, object value, CacheDependency dependencies);
public void Insert(string key, object value, CacheDependency dependencies,
DateTime absoluteExpiration, TimeSpan slidingExpiration);
// 摘要:
// 向 System.Web.Caching.Cache 对象中插入对象,后者具有依赖项、过期和优先级策略
// 以及一个委托(可用于在从 Cache 移除插入项时通知应用程序)。
//
// 参数:
// key:
// 用于引用该对象的缓存键。
//
// value:
// 要插入缓存中的对象。
//
// dependencies:
// 该项的文件依赖项或缓存键依赖项。当任何依赖项更改时,该对象即无效,
// 并从缓存中移除。如果没有依赖项,则此参数包含 null。
//
// absoluteExpiration:
// 所插入对象将过期并被从缓存中移除的时间。
// 如果使用绝对过期,则 slidingExpiration 参数必须为 Cache.NoSlidingExpiration。
//
// slidingExpiration:
// 最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟,
// 则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除。如果使用可调过期,则
// absoluteExpiration 参数必须为 System.Web.Caching.Cache.NoAbsoluteExpiration。
//
// priority:
// 该对象相对于缓存中存储的其他项的成本,由 System.Web.Caching.CacheItemPriority 枚举表示。
// 该值由缓存在退出对象时使用;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。
//
// onRemoveCallback:
// 在从缓存中移除对象时将调用的委托(如果提供)。
// 当从缓存中删除应用程序的对象时,可使用它来通知应用程序。
//
// 异常:
// System.ArgumentException:
// 为要添加到 Cache 中的项设置 absoluteExpiration 和 slidingExpiration 参数。
//
// System.ArgumentNullException:
// key 或 value 参数为 null。
//
// System.ArgumentOutOfRangeException:
// 将 slidingExpiration 参数设置为小于 TimeSpan.Zero 或大于一年的等效值。
public void Insert(string key, object value, CacheDependency dependencies,
DateTime absoluteExpiration, TimeSpan slidingExpiration,
CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
// 从应用程序的 System.Web.Caching.Cache 对象移除指定项。
public object Remove(string key);
// 将对象与依赖项策略、到期策略和优先级策略
// 以及可用来在从缓存中移除项【之前】通知应用程序的委托一起插入到 Cache 对象中。
// 注意:此方法受以下版本支持:3.5 SP1、3.0 SP1、2.0 SP1
public void Insert(string key, object value, CacheDependency dependencies,
DateTime absoluteExpiration, TimeSpan slidingExpiration,
CacheItemUpdateCallback onUpdateCallback);
}
例如:
//存放信息
Cache["nameID"]="0001";
//存放信息
Cache.Insert("nameID","0001"1);
//读取信息
string NameID=Cache["nameID"].ToString();
DateTime now = DateTime.Now;
string cachedString = (string)HttpContext.Cache["Now"];
if (string.IsNullOrEmpty(cachedString))
{
cachedString = now.ToString();
HttpContext.Cache.Insert("Now", now.ToString(), null, DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.NotRemovable,
new System.Web.Caching.CacheItemRemovedCallback(OnMoveCacheBack)//移除时调用的回调函数
);
}
private void OnMoveCacheBack(string key, object value, CacheItemRemovedReason reason)
{
DateTime now = DateTime.Now;
string cachedString = (string)HttpContext.Cache[key];
if (!string.IsNullOrEmpty(cachedString))
{
HttpContext.Cache.Remove(key);
}
HttpContext.Cache.Insert("Now", now.ToString(), null, DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.NotRemovable,
new System.Web.Caching.CacheItemRemovedCallback(OnMoveCacheBack)//移除时调用的回调函数
);
}