现在的位置: 首页 > 综合 > 正文

ASP.NET Cache 方案

2012年05月21日 ⁄ 综合 ⁄ 共 2186字 ⁄ 字号 评论关闭

ASP.NET 网站应用程序是无状态的,客户端每执行一次 PostBack 动作,所有的对象都需要重新建立;当然这样的执行模式相当没有效率,所以在 ASP.NET 应用程序中有 Application、Session、Cache 这三类资料暂存区。Application 的生命周期与应用程序相同,Session 的生命周期与个别使用者相同,而 Cache 的生命周期则由程序设计师自订,Cache 相对于 Application 及 Session 来说显示更有弹性。
选择合适的 Cache 方案能有效提升网站的执行效能,设定 Cache 过期的条件可分为下列三种。
1.绝对时间:插入对象过期并从快取移除的时间。
2.浮动时间:上次存取插入对象的时间与该对象到期的时间之间隔。如果这个数值等于二十分钟,那么对象将会在最后存取的二十分钟后过期并从快取中移除。
3.档案相依:项目的档案或快取索引键相依性。例如,假设您根据 XML 档案中的数据建立 DataSet 对象,您可以将 DataSet 加入含有 CacheDependency 对象的快取,该对象使 DataSet 相依于此 XML 档案。如果 XML 档案变更,则会从快取中移除 DataSet。
笔者常使用 Cache 来暂存经常存取的设定数据,一般作法是根据 XML 档案建立「设定类别」,这个类别再放入 Cache,并设定快取过期条件为「浮动时间+XML 档案相依」。这样的快取方案有二个优点。
1.该对象存取的频率愈多,则会优先置于 Cache,不易从 Cache 被移除。
2.当设定的 XML 档案内容变更时,Cache 则会被移除,以保持最新资料。
 
这个快取方案的算法如下
Step1:要求对象。
Step2:检查 Cache 中是否有该对象。
Step3:若 Cache 中有该对象,则取得对象跳离程序。反之则执行 Step4。
Step4:由 XML 档案建立对象,并存入 Cache,并传回该物件。
 
假设 TMySetting 对象要使用上述的快取方案,程序代码实作如下。程序代码中处理反序列化的 TBSerializerUtil.XmlFileToObject 方法 ,请参阅「物件序列化函式库」一文。

 

    ''' <summary>
    
''' 依键值取得 TMySetting 对象。
    
''' </summary>
    
''' <param name="Key">键值。</param>
    Public Function GetMySetting(ByVal Key As StringAs TMySeting
        
Dim sCacheKey As String
        
Dim oCache As System.Web.Caching.Cache
        
Dim oMySeting As TMySeting
        
Dim sFileName As String

        '快取键值为「型别名称.键值」
        sCacheKey = String.Format("{0}.{1}"GetType(TMySeting).Name, Key)

        'ASP.NET 快取物件
        oCache = System.Web.HttpContext.Current.Cache

        If oCache(sCacheKey) IsNot Nothing Then
            
'直接由 Cache 取得该对象
            oMySeting = CType(oCache(sCacheKey), TMySeting)
        
Else
            
'由 XML 档案建立对象
            sFileName = "对象对应的文件名称"
            oMySeting 
= CType(TBSerializerUtil.XmlFileToObject(sFileName, GetType(TMySeting)), TMySeting)

            '将对象存入 Cache,并设定快取移除时机
            '1.档案相依
            '2.浮动时间为 5 分钟
            oCache.Insert(sCacheKey, oMySeting, _
                          
New System.Web.Caching.CacheDependency(sFileName), _
                          System.Web.Caching.Cache.NoAbsoluteExpiration, 
New TimeSpan(050))
        
End If
        
Return oMySeting
    
End Function

 

后记:
在 EnterpriseLibrary 中也有处理快取的 CacheManager 对象,它类似 ASP.NET 的 Cache 物件。若是撰写三层式架构,也可以使用 EnterpriseLibrary 的 CacheManager 来取代 ASP.NET Cache,往后有时间再来介绍 EnterpriseLibrary 的 CacheManager 对象。

抱歉!评论已关闭.