2017-07-31 116 views
2

我需要從DB中緩存以下數據以便於訪問:如何緩存映射數據

數據被如此映射:A,B和C都是具有ID的對象。我將有作爲,B和C的列表,使得:

  • 許多被映射到許多燒烤
  • 許多B映射到許多銫

我將獲得一個A和一個C和將被要求查找如果C落在給出A.

我想我可以有2個高速緩存

  • ABCache:什麼是BS爲A - 1:許多
  • BCCache:什麼是銫的每個B - 1:許多

辦法一:我可以通過BCCache循環,找到通過ABCache的B,然後循環,找出A和然後比較給定的A.

另一種方法:我可以遍歷ABCache並找到所有Bs,然後循環遍歷Bs以查看C是否落入任何Bs中。

還有其他更好的方法嗎?

+0

如果這是您需要進行的唯一查找,您還可以使用「ACCache」。插入是一個更加昂貴的過程,但最後你需要更少的內存,並且獲得更快的結果 - 尤其是如果你對緩存進行排序 – maja

+0

爲什麼不使用一個大對象來存儲每個C的A呢?你可以發現C是否立即落入A. – maja

回答

0

根據你的描述每個C可以映射到許多B S和每個B可以映射到許多C S和許多A s,而每個A可以映射到許多B秒。

您可以將這樣的數據描述爲圖形,實際上幾乎允許任何邊緣,除了從cA的直接邊緣或反之亦然。

然後,對於任何給定的CA你可以找到,如果有開始在此給出C通過只有一個B傳遞給定A.緩存這樣的數據

一種方式的路徑是有一個地圖地圖(或地圖集,如果您只關心是否存在CA之間的路徑,但不關心通過哪個B),使得第一個地圖的關鍵字是C,並且該值是具有關鍵字它連接的是A,值是連接它們的B

如果我們談論的代碼,它會看起來如下:

public class Cache<C, A> { 

    Map<C, Set<A>> cache = new HashMap(); 

    public boolean isConnected(C c, A a) { 
     if(cache.containsKey(c)) { 
      if(cache.get(c).contains(a)) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

如果你的數據是相對靜態這將工作正常。如果您的數據發生變化,那麼爲數據中的每個更改更新緩存的開銷都會太高。

我個人認爲SQL查詢比維護這樣的緩存緩存更有效率。