private void EmpDetailsRemoved(string key, object val,
CacheItemRemovedReason reason)
{
//When the item is expired
if (reason == CacheItemRemovedReason.Expired)
{
//Again add it to the Cache
AddItemsToCache();<BR> }
}
在上面的例子中,你必须注意CacheItemPriority这个参数,它和Callback参数一起使用。CacheItemPriority用来设置增加到缓存中的对象的优先级。这个优先权告诉Cache当内存一旦很低时,这个优先级会指示对象的释放顺序。这个过程被称为清除(scavenging)。
.NET Remoting
你也许会想.NET remoting如何用于数据缓存?当我第一次听到这个问题时,这个问题就进到了我的脑海中。正如你所知道的.NET Remoting通过单例把对象共享给各个客户端,所以使用单例的对象可以用来缓存数据以共享数据给各个不同的客户端。因为.NET Remoting可以运行在进程和机器之外,当我们想要缓存对象并且跨服务、跨用户、尤其是用在网站群时,这个特性非常有用。这种方法我们可以将数据缓存到单例对象的数据成员里并且提供方法去读取和存储数据。当我们实现这种方法时,我们必须确保缓存的remoting对象不被垃圾回收器清除了。因而我们必须设置Remoting对象的缓存永不过期以至永远不会超时。我们可以重写InitializeLifetimeService和MarshalByRefObject方法使它们返回Null。但是这样做的主要问题是性能,通过分析使用这种方法比其它方法的性能都差。不管怎样,应该由设计师或开发者根据具体需求选择出最合适的方法。
内存映射文件(Memory-Mapping files)
大家都知道内存映射文件是什么,它基于映射到物理磁盘上的文件到应用程序存储空间的一个特定的地址范围。这种方式允许不同的进程使用相同的数据从而增加应用程序的性能。因为使用内存映射文件在ASP.NET应用中并不流行,我个人也不建议使用这种方法因为它增加了程序的复杂性,并且.NET Framework也不支持这样。但是如果有人喜欢使用这种方法的话,他必须为他们的需求开发出自定义的解决方案。
静态变量(Static variables)
我们可以使用静态变量来存储全局的数据或对象,以便在整个应用程序生命周期来访问它。同样地,我们也可以使用静态对象来缓存数据,并且可以提供方法来从缓存中检索和存储数据。因为静态对象存储在进程中,性能非常快。但是用静态变量实现过期策略和缓存依赖是非常复杂的,我还是比较喜欢使用Cache相比用静态变量。另一个问题是用户自定义缓存对象必须是线程安全的,所以实现它必须特别小心。
自定义静态缓存可以用下面方法实现:
复制代码 代码如下:
public class CustomCache
{
//Synchronized to implement thread-safe
static Hashtable _myCache =
Hashtable.Synchronized(new Hashtable());
public static object GetData(object key)
{
return _myCache[key];
}
public static void SetData(object key, object val)
{
_myCache[key] = val;
}
}
数据库
我们可以使用数据库来存储数据来实现跨用户、跨机器的数据共享。当我们想要缓存非常大的数据对象时,这是一种非常好的方式。使用这种方式来存储小的数据是得不偿失的(性能低),用于存储少量数据可以寻找其它进程内的缓存机制。存储到数据库中的缓存数据需要经过序列化成XML来方便存储和检索,在.NET Framework中我们也可以使用其它类型的序列化格式。
页面输出缓存(ASP.NET page output caching)