ASP.NET Cache 方案

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 方法 ,請參閱「物件序列化函式庫」一文。

 


    ''' <summary>
    ''' 依鍵值取得 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 物件。

ASP.NET 魔法學院