2017-07-31 40 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查询比维护这样的缓存缓存更有效率。