Guava缓存的BiMap功能是什么?

4
我在数据库中有一个简单的映射表,将整数键与某些值相关联。一旦我将这些值放入表中,它们就永远不会消失。我想使用 Guava Cache,以便可以查找这些键并将其保留在内存中。看起来 Guava Cache 可以让我轻松地做到这一点。但是我需要双向映射:从键到值,从值到键,就像一个 BiMap
是否有一种简单的方法可以使用 Cache 获得 BiMap 功能,还是我必须自己编写解决方案?
是否有一个允许并发访问的 BiMap 实现,或者如果我想要高效的多线程访问,我必须使用读写锁?
1个回答

2
有没有一种简单的方法可以使用缓存来实现BiMap功能,或者我必须自己解决这个问题?
有Maps.synchronizedBiMap,但我认为它不是一个好的起点,因为添加所有缓存功能可能比将Bi添加到Cache中更难。
它也只是同步的,而不是并发的。
有允许并发访问的BiMap实现吗?
据我所知没有。
如果我想要高效的多线程访问,我是否必须使用读写锁?
我猜这取决于您需要BiMap功能的哪一部分。BiMap允许您
- 在两个方向上进行get和put - 通过forcePut或通过在冲突时抛出异常的put来保留双射性
如果您确信永远不会发生冲突,那么它并不复杂。也许你只需要像我一样使用两个缓存这里
据我所知,为了保持双射性,您需要锁定。如果写入不太常见,则可以使用单个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”,但很简单,也许适用于您的缓存。


在哪里进行 piggy back?链接是 404。 - harschware
1
@harschware 已修复。 - maaartinus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接