我在数据库中有一个简单的映射表,它将整数键与某些值关联起来。一旦我将这些值粘贴到表中,它们就永远不会消失。我想使用Guava Cache
这样这些键可以被查找一次,然后保存在内存中。看起来 Guava Cache
可以让我轻松地做到这一点。但是,我需要两种方式映射:从键到值,以及从值到键,就像 BiMap 一样。
有没有一种简单的方法可以使用缓存
来获取BiMap
功能,或者我必须推出自己的解决方案?
是否有允许并发访问的 BiMap
实现,或者如果我想要高效的多线程访问,我是否必须使用读写锁?
最佳答案
Is there a simple way to get BiMap functionality using a Cache, or will I have to roll my own solution?
有 Maps.synchronizedBiMap
,但我认为这不是一个好的起点,因为添加所有 Cache
功能可能比添加 困难得多Bi
到缓存
。
它也只是同步,而不是并发。
Is there a BiMap implementation that allows concurrent access,
据我所知没有。
or will I have to use read-write locks if I want efficient, multi-threaded access?
我想,这取决于您需要 BiMap 功能的哪一部分。 BiMap
允许您
- 双向
获取
和放置
- 通过
forcePut
或通过put
在冲突时抛出异常来保持双射性
如果您确定不会发生冲突,那么事情就没那么复杂。也许您所需要的只是像我一样搭载两个缓存here .
<小时/>据我所知,为了保持双射性,你需要锁。如果写入不太常见,那么使用单个 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,但是很简单,也许它也适用于您的缓存。
关于caching - Guava Cache 的 BiMap 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25961342/