2015-08-03 80 views
0

我目前緩存列表List<CachedObject>中的DB對象。 CachedObject看起來是這樣的:Java緩存幾個地圖中的對象與一個列表

class CachedObject 
{ 
    private int id; 
    private int id_type; 
    private int id_other_type; 

    // getters and setters 
} 

我目前在該高速緩存中獲取對象的功能

public CachedObject getCachedObjectById(Integer id) 
    { 
     for (CachedObject cachedObject : cachedObjectList) 
      if(id.equals(cachedObject.getId())) 
       return cachedObject; 

     return null; 
    } 

    public List<CachedObject> getCachedObjectByIdType(Integer idType) 
    { 
     List<CachedObject> cachedObjectList = new ArrayList<CachedObject>(); 

     for (CachedObject cachedObject : this.cachedObjectList) 
      if(idType.equals(cachedObject.getIdType())) 
       cachedObjectList.add(cachedObject); 

     return cachedObjectList; 
    } 

由於這是做了很多,這將是更快,加載緩存,在單獨發佈信息時,地圖(在這種情況下爲3):

Map<Integer, CachedObject> cachedObject_to_id 
Map<Integer, List<CachedObject>> cachedObjectList_to_idType 
Map<Integer, List<CachedObject>> cachedObjectList_to_idOtherType 

當獲取對象時,只需從地圖中獲取對象。

EDIT

在任何不同時間數高速緩存的對象的是20 - 500

+1

你爲什麼不嘗試呢?請記住(我們無法爲您解答)維護多個地圖會增加總體時間,但可能會縮短查找/檢索時間。這對你有影響嗎? –

+0

你在這裏有什麼問題?給我們一個具體的問題,我們可以幫助你。閱讀[如何提問](http://stackoverflow.com/help/how-to-ask) –

+0

緩存對象的數量非常少,以至於使用哪一個並不重要。使用你感覺更舒適的那個。 – Kayaman

回答

1

訪問哈希表通常是更快然後使用順序掃描方法。但是,如果只有幾個值(小於10),那麼它並不重要。

備註:方法getCachedObjectByIdType返回一個可變列表。如果客戶端代碼不受您控制,您可以將其轉換爲不可變列表。

我稍微傾向於在你的情況下使用地圖。原因:

  • 訪問速度會更快
  • 的訪問時間保持不變,當更多的數據來自於
  • 需要對接入對象不分配不發生變化。你需要一個用於迭代器,另一個用於數組列表。也許另一個將它轉換爲不可變列表。

但代碼變得更復雜。在最糟糕的情況下,如果必須掃描500個對象,這意味着,通過使用哈希映射,您的代碼可以快兩個數量級。但是,這可能對應用程序沒有影響。要問的問題:

  • 什麼是這些對象的訪問頻率?它是非常重要的東西,經常訪問嗎?
  • 我真的想用500個元素做一個額外的測試來檢查整體表現是否可以接受?
  • 我需要多久更新緩存並重建數據結構?
  • 完全構建地圖還是使用延遲加載?
  • 我該如何解決併發問題?是否存在地圖的併發修改,還是隻讀?
相關問題