番石榴缓存的BiMap功能?

时间:2014-09-21 16:29:22

标签: caching guava bimap

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

是否有使用BiMap获取Cache功能的简单方法,还是我必须推出自己的解决方案?

是否存在允许并发访问的BiMap实现,或者如果我需要高效的多线程访问,是否必须使用读写锁?

1 个答案:

答案 0 :(得分:2)

  

是否有一种使用Cache获取BiMap功能的简单方法,还是我必须推出自己的解决方案?

Maps.synchronizedBiMap,但我不认为这是一个很好的起点,因为添加所有Cache功能可能比添加{更难“ {1}}到Bi

它也是同步的,而不是并发的。

  

是否存在允许并发访问的BiMap实现

AFAIK no。

  

或者如果我想要高效的多线程访问,我是否必须使用读写锁?

我想,这取决于您需要Cache功能的哪一部分。 BiMap允许您

  • 向两个方向的BiMapget
  • 通过put或通过forcePut在冲突中抛出异常来保持双重性

如果您确定不会发生任何冲突,那么它并不复杂。也许你所需要的只是像我here那样搭载两个缓存。


AFAIK为了保持生命力,你需要锁定。如果写入不太常见,那么您可以使用单个put快速完成。否则....

您可以尝试使用ReadWriteLock来获得最大的并发性,但我担心,它太棘手了,因为您需要根据密钥和密钥来锁定条带值。以及Striped的情况下的先前值。


每当我使用forcePut时,我后来发现我实际上需要以两种以上的方式获得某些东西(一些二级密钥)或者我需要获得一些额外的信息。所以我将它转换为类似

的类中的两三个地图
BiMap

它有点hacky,但很简单,也许它也适用于你的缓存。