我在数据库中有一个简单的映射表,它将整数键与某些值相关联。一旦我将这些值放在表格中,它们就永远不会消失。我想使用 Guava Cache
以便这些键可以被查找一次,然后保存在内存中。看起来 Guava Cache
可以让我轻松地做到这一点。但是我需要双向映射:从键到值,从值到键,就像 BiMap
。
有没有一种使用 BiMap
获得 Cache
功能的简单方法,还是我必须推出自己的解决方案?
是否有 BiMap
实现允许并发访问,或者如果我想要高效的多线程访问,我是否必须使用读写锁?
最佳答案
有 Maps.synchronizedBiMap
,但我认为这不是一个好的起点,因为添加所有 Cache
功能可能比将 Bi
添加到 Cache
困难得多。
它也只是同步的,而不是并发的。
AFAIK 没有。
我想,这取决于您需要 BiMap
功能的哪一部分。 BiMap
允许你
get
和 put
双向 forcePut
或通过 put
在冲突时抛出异常来保持双射性 如果您确定不会发生任何冲突,那么事情并没有那么复杂。也许您所需要的只是像我所做的 here 那样搭载两个缓存。
AFAIK 为了保持双射性,你需要锁。如果写入不太常见,那么您可以使用单个
ReadWriteLock
快速完成。除此以外....您可以尝试使用
Striped
来实现最大并发性,但恐怕这太棘手了,因为您需要根据键和值来锁定 strip 。以及在 forcePut
的情况下的先前值。每当我使用
BiMap
时,我后来发现我实际上需要以两种以上不同的方式(一些辅助键)获取某些东西,或者我需要获取一些额外的信息。所以我把它转换成一个类中的两个或三个 map 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,但很简单,也许它也适用于您的缓存。