2011-05-28 35 views
0

我基於數據大小廣泛分爲兩類不同的數據緩存要求: 1)非常小的數據(2-30個字符) - 這包括諸如給定entityId的類型代碼之類的東西。該系統基於父子實體層次結構的概念,並且動作是針對與實體類型代碼一起構建的值進行授權的。爲不同的實體緩存這些類型代碼可節省數據庫讀取時間。 2)中型/大型數據 - 這是一般數據,如產品描述和頁面。不同的哈希表cacheItem具有相似的數據值或單獨的cacheItems爲每個數據值 - 這是一種有效的方法?

我很困惑哪種方法更適合於第一類數據。 我可以緩存它是這樣的:

HttpRuntime.Cache.Insert("typeCode" + entityId, entityTypeCode); 

或像這樣:

Dictionary<int, string> etCodes = 
    (Dictionary<int, string>)HttpRuntime.Cache["typeCode"]; 
etCodes[entityId] = entityTypeCode; 

顯然,在第二種方法中,我保留對每個ENTITYID不必要的緩存項。 或者,如果Cache對象填充了幾個這樣的小尺寸項目,那麼可以。

哪些方法在性能和開銷方面很好?

回答

0

就我個人而言,我會採取你的第二種方法的一個單一的對象,並使用自定義對象,而不是Dictionary

這將使我能夠稍後控制更多方面,如對象內物品的到期或更改實施。

我會做與此類似:

public class MyCacheObject 
{ 
    public static MyCacheObject 
    { 
     get 
     { 
      // ...Omitted locking here for simplification... 

      var o = HttpRuntime.Cache["MyCacheObject] as MyCacheObject; 
      if (o = null) 
      { 
       o = new MyCacheObject(); 
       HttpRuntime.Cache["MyCacheObject] = o; 
      } 
      return o; 
     } 
    } 

    public object GetEntity(string id, string code) 
    { 
     // ... 
    } 

    public void SetEntity(object entity, string id, string code) 
    { 
     // ... 
    } 

    // ... 
} 

如果您有實體的是定製的基類中,GetEntitySetEntity方法可進一步優化。

+0

如何在您的視圖可以過期自定義對象內處理?你會運行一個單獨的線程來監視相同的? – 2011-05-28 19:16:17

+0

也許是一個單獨的線程,或者,如果它足夠高性能的話,每次在'GetEntity'或'SetEntity'函數內調用像'checkExpiration()'這樣的函數。 – 2011-05-28 19:19:00

相關問題