caching - Guava Cache 的 BiMap 功能?

标签 caching guava bimap

我在数据库中有一个简单的映射表,它将整数键与某些值关联起来。一旦我将这些值粘贴到表中,它们就永远不会消失。我想使用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/

相关文章:

python - Celery 任务实例化缓存

java - 使用jms实现缓存失效实用吗?

java - 聚集 HashMap

java - Google Collections ImmutableMap 迭代顺序

Java:用于确定等价性的外部类?

java - 增量浮点均值算法的选择(java)

ruby-on-rails - 在 Rails 中访问缓存时 "stale, valid, store"是什么意思?

c++ - 应使用哪种数据结构 multimap、boost::bimap、multiset 或任何其他数据结构

c++ - 用于枚举的 boost::bimap

dictionary - 如何在 Kotlin 中反转 map ?