我在数据库中有一个简单的映射表,它将整数键与某些值相关联.一旦我坚持表中的价值观,他们永远不会消失.我想使用
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,但很简单,也许它也适用于你的缓存.