数据缓存

数据缓存是最灵活的缓存方式,但是它页强制你采取专用的步骤来实现。基本的原则是你添加那些创建起来比较昂贵的项到专用的内建的集合对象中(Cache类)。这个对象工作起来有点像Application。他对所有的请求都可见,当然们也有一些不同的地方:

Cache对象是线程安全的:这意味着,你不需要在添加或者删除项的时候显式的加锁。

cache中的项会被自动的删除。ASP.NET会删除过期项,或者当内存很少的时候也会删除。这意味着你可以自由的使用cache而不需要担心浪费服务器内存。也因为这一点,你不知道cache项是否被删除了,所有你在使用的时候要检查是否还存在。

cache中的项支持依赖性:你能够将缓存的对象关联到一个文件,或者数据库的表或者其他任何资源,如果这些资源改变,你的缓存对象也会自动的失效并且被释放。
 

缓存对象存储于应用程序进程中,这意味着当应用程序被重启,缓存也就没有了,并且它也不能在多个计算机中共享。这是故意这么设计的,因为多个计算机进程间通信会损害性能。

Cache.Insert,Cache.Remove,使用比较简单,可以自行查阅msdn。

此处说一下Cache.Insert的一个重载方法

Insert(String, Object, CacheDependency, DateTime, TimeSpan, CacheItemPriority, CacheItemRemovedCallback)

最后2项参数,一个是CacheItemPriority,一个是CacheItemRemovedCallback。

CacheItemPriority的用处是指明优先级,当缓存由于内存不够时,要清除一些缓存的时候,就会按照这个优先级来清除。

Low,在服务器释放系统内存时,具有该优先级级别的缓存项最有可能被从缓存删除。

BelowNormal,在服务器释放系统内存时,具有该优先级级别的缓存项比分配了 Normal 优先级的项更有可能被从缓存删除。

Normal,在服务器释放系统内存时,具有该优先级级别的缓存项很有可能被从缓存删除,其被删除的可能性仅次于具有 Low 或 BelowNormal 优先级的那些项。 这是默认值。

AboveNormal,在服务器释放系统内存时,具有该优先级级别的缓存项被删除的可能性比分配了 Normal 优先级的项要小。

High,在服务器释放系统内存时,具有该优先级级别的缓存项最不可能被从缓存删除。

NotRemovable,在服务器释放系统内存时,具有该优先级级别的缓存项将不会被自动从缓存删除。 但是,具有该优先级级别的项会根据项的绝对到期时间或可调整到期时间与其他项一起被移除。

Default,缓存项优先级的默认值为 Normal。

CacheItemRemovedCallback是一个委托,签名如下:public delegate void CacheItemRemovedCallback( string key, Object value, CacheItemRemovedReason reason ) 

当缓存被删除的是会调用该回调方法。相应的还有一个 CacheItemUpdateCallback委托,在Insert的另一个重载方法中。

看如下示例代码:

protected void Page_Load(object sender, EventArgs e)
       {
           Cache.Insert("Key1", "value", null, DateTime.Now.AddDays(10), Cache.NoSlidingExpiration, CacheItemPriority.Default, (x, y, z) => { Response.Write(x.ToString() + y.ToString() + z.ToString()); });//采用拉姆达表达式,简便
           //Cache.Insert("Key1", "value", null, DateTime.Now.AddDays(10), Cache.NoSlidingExpiration, CacheItemPriority.Default, RemovedCallback);//采用传统的定义一个方法的方式,把方法名作为委托的参数。
           if (Cache["Key1"] != null)
               Cache.Remove("Key1");
       }

       public void RemovedCallback(String k, Object v, CacheItemRemovedReason r)
       {
           Response.Write(k.ToString() + v.ToString() + r.ToString());
       }

上面的代码定义了一个委托。当该缓存被删除的时候,调用该委托方法。上面的例子中,插入一个缓存,然后马上删除,它会调用方法,在页面上打印出Key1valueRemoved。