4

我在数据库中有一个简单的映射表,它将整数键与某些值相关联。一旦我将这些值粘贴在表格中,它们就永远不会消失。我想使用番石榴Cache,这样这些键就可以被查找一次,然后保存在内存中。看起来番石榴Cache可以让我轻松做到这一点。但是我需要映射两种方式:从键到值,以及从值到键,例如BiMap.

有没有一种简单的方法来BiMap使用 a 获得功能Cache,还是我必须推出自己的解决方案?

是否有BiMap允许并发访问的实现,或者如果我想要高效的多线程访问,我是否必须使用读写锁?

4

1 回答 1

2

有没有一种简单的方法来使用缓存获得 BiMap 功能,还是我必须推出自己的解决方案?

Maps.synchronizedBiMap,但我认为这不是一个好的起点,因为添加所有Cache功能可能比添加BiCache.

它也只是同步的,而不是并发的。

是否有允许并发访问的 BiMap 实现,

AFAIK 没有。

或者如果我想要高效的多线程访问,我是否必须使用读写锁?

BiMap我想,这取决于您需要功能的哪一部分。允许BiMap

  • get往来往put两个方向
  • forcePut通过或通过put在冲突中抛出异常来保持双射性

如果您确定永远不会发生冲突,那么它就没有那么复杂。也许你需要的只是像我在这里做的那样搭载两个缓存。


AFAIK 为了保持双射性,你需要锁。如果写入不太常见,那么您可以使用单个ReadWriteLock. 否则....

您可以尝试使用Striped最大并发性,但恐怕这太棘手了,因为您需要根据键和值锁定条带。并且在 的情况下也是以前的值forcePut


每当我使用BiMap时,我后来发现要么我实际上需要通过两种以上不同的方式(一些辅助键)来获取某些东西,要么我需要获取一些额外的信息。所以我将它转换为一个类中的两个或三个地图

void put(K1 k1, K2 k2, E extraInfo) {
    MyEntry<K1, K2, E> e = new MyEntry<>(k1, k2, extraInfo);
    firstMap.put(k1, e);
    secondMap.put(k2, e);
}

MyEntry<K1, K2, E> getByFirstKey(K1 k1);
MyEntry<K1, K2, E> getBySecondKey(K2 k2);

这有点hacky,但很简单,也许它也适用于您的缓存。

于 2014-09-21T19:15:46.283 回答