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 对象。
''' </summary>
''' <param name="Key">键值。</param>
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 对象。