2011-01-28 39 views
1

我的實體有兩個唯一的ID(是的這是錯誤的,但它是一個要求)。我想組織這些實例的緩存。在緩存中的搜索可以通過id1或id2或id1和id2來進行。通過id1和id2搜索都可以 - 我將製作複合密鑰。但是,如何處理由ID中的一個搜索。什麼應該是緩存鍵?我正在使用ehcache。緩存重點組織問題

我有一個情況,其中幾個鍵可能指代相同的 對象。

喜歡ehcache的並不能支持此功能,相同的 對象將被存儲用於每個鍵(n中的 相同的對象,其中n是diferent鍵 即該對象可以從refered的數目的實例)。

在某些時候,我有知識來計算 其他鍵,但不是在我需要它們之前。

情況:

GEN KEY(1) 檢查對象是在高速緩存(2) TRUE:Retreve它

FALSE:處理新的對象(3) 其放置在ehcache的 返回OBJECT

在點(1)只知道其中一個鍵。在點 (3)可以知道在ehcache中對象可能與其關聯的所有密鑰。 問題是在點(2)需要密鑰。

THX

+0

我發現了一個錯誤的ehache用同樣的情況礦井已關閉作爲有某種指數效用稱爲jofti不會評論修復,但我猜想它已經死了。也許有人知道這個jotfi用什麼模式來實現多鍵緩存的搜索? – user253202 2011-01-28 14:16:01

+0

http://jira.terracotta.org/jira/browse/EHC-268?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel – user253202 2011-01-28 14:16:20

回答

1

我不能告訴了的Ehcache,但我一直有用作緩存HashMap類似的問題。我只是把每個值放在Map中兩次,它並不昂貴並且運行良好。

由於我的鑰匙類型不同,我使用了Map<Object, V>

+0

我是的,我看到的,但我的實體需要多少內存來緩存它兩次) – user253202 2011-01-28 13:27:05

1

一種選擇是使用兩個地圖。每個id集有一個,但兩者都指向同一組值。

如果搜索上ID1只是查找在第一張地圖的價值,如果ID2,只是在第二張地圖查找。如果您需要同時搜索,請查找兩個值並查看值是否相同。

根據您對以下問題和意見的更新進行更新: 在您的ecache中使用這兩個鍵。是的,這會佔用更多空間,並且可能有時候您正在查找的對象已經在另一個鍵下的緩存中。但是,緩存應該存儲常見的查找鍵。它不應該在意這個價值可能存在於另一個關鍵之下。所以我不會強調自己試圖優化您的緩存以基於兩個密鑰進行查找。

1

來完成你願意,你可以通過傳遞,存儲在緩存中,不僅對象,而且還使用存儲每個鍵指向你的對象索引做什麼。 例如:
cache [「key1」] = theIndex;
cache [「key2」] = theIndex;
cache [theIndex] = object;

所以,當你請求緩存[「鍵1」]你會得到一個索引(你要知道這是一個索引),然後使用該索引得到實際的對象。

的代碼可以去類似:

public class CacheUtil { 

    ... any necessary code here 

    public static void put(String key, Serializable obj) { 
    if (obj instance of Cacheable) { 
     //Cacheable interface identifies the cacheable object that has the getKeys method 
     String[] keys = obj.getKeys(); 
     if (keys != null && keys.length > 0) { 

     for (String myKey : keys) { 
      //CacheIndex identifies the index 
      cache.put(new Element(myKey, new CacheIndex(hashCode))); 
     } 
     key = hashCode(keys); //change the key. Can be a hashcode of the keys 
     } 
    } 

    cache.put(new Element(key, obj)); 
    } 

    public static Serializable get(String key) { 

    Serializable obj = cache.get(key); 

    return ((null != serializable) && (serializable instanceof CacheIndex)) ? 
      get(((CacheIndex)serializable).getIndex(), area) : obj; 
    } 

}