smhy8187

 

浅谈ASP.NET中Cache的应用

概述
Cache作为ASP.Net应用程序状态管理之一的方法,管理瞬间状态的高速缓存对象,在并发量大,效率要求较高的Application应用较广。
Cache除了与Application一样是一个简单的键、值对的HashTable之外,还有其独特之处:
1. Cache可以基于依赖项的终止
  依赖项可以是其他的Cache关键字、文件或者是时间戳。如果Cache的依赖项发生改变或终止,该项Cache内容就会无效并移除。
2. 锁定管理
  ASP.net是多线程系统,当多个线程同时访问Cache时,必然应用锁定防止同时更新。这个问题Appliction的解决方法是用Lock()和UnLock()方法来锁定,当然,Cache不同,其可以自行管理内部锁定,所以更新Cache时,程序员不用做任何操作。
3. CallBack回调
该功能可以在Cache被删除时运行代码。

应用
如何把Cache应用到我们的实现工作中呢?偶目前正在做一个KMS项目,并发量很大且对速度效率要求很高,在前台展现方面可能会出现性能瓶颈。为此,我们考虑应用SQL Server 2000生成XML文件,并把XML存入高速缓冲(Cache),前台展现只从XML文档获取数据,这样可以减少访问数据库,同时读取Cache中的数据,速度也可以保证。下面是其中一段代码,仅供参考。
protected void RefreshCache (string key, object item,CacheItemRemovedReason reason) 
    

        
string filename="c:\abc.xml";
        XmlDocument xmldoc
=new XmlDocument();

        xmldoc.Load(filename);
        

        CacheXml.Insert(
                
"CacheName"
                ,xmldoc
                ,
new CacheDependency (filename)
                ,Cache.NoAbsoluteExpiration
                ,Cache.NoSlidingExpiration
                ,CacheItemPriority.Default
                ,
new CacheItemRemovedCallback (RefreshCache) 
                );

    }


------------------

Blog经过一次大的修整后 
几个页面都采用了Cache机制,并设定了相应的过期时间 
这样会加快页面的载入,减少等待的时间 

但同时也有一个弊端:无法正确获取最新的记录 
如发布一篇日志后,可能不会立即在首页显示出来,必须等缓存过期后, 
才会再从数据库查询一次,此时才会看到最新的记录. 

有时可能需要立即更新,这里就必须手工清除一下Cache 
Cache类有一个Remove方法,但该方法需要提供一个CacheKey,但整个网站的CacheKey我们是无法得知的 
只能经过遍历 

protected void RemoveAllCache() 
   { 
       
      System.Web.Caching.Cache _cache = HttpRuntime.Cache; 
      IDictionaryEnumerator CacheEnum = _cache.GetEnumerator(); 
      ArrayList al = new ArrayList(); 
      while (CacheEnum.MoveNext()) 
      { 
         al.Add(CacheEnum.Key); 
      } 

      foreach (string key in al) 
      { 
         _cache.Remove(key); 
      } 
      show(); 
   } 
//显示所有缓存 
   void show() 
   { 
      string str = ""; 
      IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator(); 
       
      while (CacheEnum.MoveNext()) 
      { 
         str += "缓存名<b>[" + CacheEnum.Key+"]</b><br />" ; 
      } 
      this.Label1.Text = "当前网站总缓存数:" + HttpRuntime.Cache.Count + "<br />"+str; 
   } 

posted on 2007-12-19 10:29  new2008  阅读(1208)  评论(0编辑  收藏  举报

导航