缓存 – 番石榴缓存的BiMap功能?

我在数据库中有一个简单的映射表,它将整数键与某些值相关联.一旦我坚持表中的价值观,他们永远不会消失.我想使用
Guava Cache,这样可以一次查找这些键,然后保存在内存中.它看起来像Guava Cache将允许我轻松地做到这一点.但是我需要映射两种方式:从键到值,从值到键,如BiMap.

有没有一种使用Cache获取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,

AFAIK没有.

or will I have to use read-write locks if I want efficient, multi-threaded access?

我猜,这取决于你需要BiMap功能的哪个部分. BiMap允许你

>获得并投入两个方向
>通过forcePut或通过put在冲突中抛出异常来保持生物活性

如果你确定不会发生冲突,那就不那么复杂了.也许你所需要的只是像我做here那样搭载两个缓存.

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,但很简单,也许它也适用于你的缓存.

点赞