2008年8月28日星期四

ASP.NET Cache 方案

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 方法 ,请参阅「物件序列化函式库」一文。



'''
''' 依键值取得 TMySetting 对象。
'''

''' 键值。
Public Function GetMySetting(ByVal Key As String) As 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(0, 5, 0))
End If
Return oMySeting
End Function


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

没有评论: