asp教程.net 提供三种主要形式的缓存:页面级输出缓存、用户控件级输出缓存(或称为片段缓存)和缓存 api。输出缓存和片段缓存的优点是非常易于实现,在大多数情况下,使用这两种缓存就足够了。而缓存 api 则提供了额外的灵活性(实际上是相当大的灵活性),可用于在应用程序的每一层利用缓存
缓存 api,使用 cache 对象
页面级和用户控件级输出缓存的确是一种可以迅速而简便地提高站点性能的方法,但是在 asp.net教程 中,缓存的真正灵活性和强大功能是通过 cache 对象提供的。使用 cache 对象,您可以存储任何可序列化的数据对象,基于一个或多个依赖项的组合来控制缓存条目到期的方式。这些依赖项可以包括自从项被缓存后经过的时间、自从项上次被访问后经过的时间、对文件和/或文件夹的更改以及对其他缓存项的更改,在略作处理后还可以包括对数据库教程中特定表的更改。
在 cache 中存储数据
在 cache 中存储数据的最简单的方法就是使用一个键为其赋值,就像 hashtable 或 dictionary 对象一样:
cache["key"] = "value";
这种做法将在缓存中存储项,同时不带任何依赖项,因此它不会到期,除非缓存引擎为了给其他缓存数据提供空间而将其删除。要包括特定的缓存依赖项,可使用 add() 或 insert() 方法。其中每个方法都有几个重载。add() 和 insert() 之间的唯一区别是,add() 返回对已缓存对象的引用,而 insert() 没有返回值(在 c# 中为空,在 vb 中为 sub)。
示例
cache.insert("key", myxmlfiledata, new
system.web.caching.cachedependency(server.mappath("users.xml")));
该示例可将文件中的 xml 数据插入缓存,无需在以后请求时从文件读取。 cachedependency 的作用是确保缓存在文件更改后立即到期,以便可以从文件中提取最新数据,重新进行缓存。如果缓存的数据来自若干个文件,还可以指定一个文件名的数组。
cache.insert("dependentkey", mydependentdata, new
system.web.caching.cachedependency(new string[] {}, new string[]
{"key"}));
该示例可插入键值为 "key" 的第二个数据块(取决于是否存在第一个数据块)。如果缓存中不存在名为 "key" 的键,或者如果与该键相关联的项已到期或被更新,则 "dependentkey" 的缓存条目将到期。
cache.insert("key", mytimesensitivedata, null,
datetime.now.addminutes(1), timespan.zero);
绝对到期:此示例将对受时间影响的数据缓存一分钟,一分钟过后,缓存将到期。注意,绝对到期和滑动到期(见下文)不能一起使用。
cache.insert("key", myfrequentlyaccesseddata, null,
system.web.caching.cache.noabsoluteexpiration,
timespan.fromminutes(1));
滑动到期:此示例将缓存一些频繁使用的数据。数据将在缓存中一直保留下去,除非数据未被引用的时间达到了一分钟。注意,滑动到期和绝对到期不能一起使用
下面是一款详细的实例。
using system.collections.generic;
using system.web;
using system;
namespace dataaccess
{
///
/// 缓存控制类
///
public class cachecontrol
{
public static listallusecachekey = new list ();
///
/// 添加缓存
///
///
///
///
public static void addcache(string key, object value, datetime absoluteexpiration)
{
if (!allusecachekey.contains(key))
{
allusecachekey.add(key);
}
httpcontext.current.cache.add(key, value, null, absoluteexpiration, timespan.zero, system.web.caching.cacheitempriority.normal, null);
}
///
/// 移除缓存
///
///
public static void removecache(string key)
{
if (allusecachekey.contains(key))
{
allusecachekey.remove(key);
}
httpcontext.current.cache.remove(key);
}
///
/// 清空使用的缓存
///
public static void clearcache()
{
foreach (string value in allusecachekey)
{
httpcontext.current.cache.remove(value);
}
allusecachekey.clear();
}
}
}