我在数据库中有一个简单的映射表,它将整数键与某些值相关联。一旦我将这些值放在表格中,它们就永远不会消失。我想使用 Guava Cache 以便这些键可以被查找一次,然后保存在内存中。看起来 Guava Cache 可以让我轻松地做到这一点。但是我需要双向映射:从键到值,从值到键,就像 BiMap

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

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

最佳答案



Maps.synchronizedBiMap ,但我认为这不是一个好的起点,因为添加所有 Cache 功能可能比将 Bi 添加到 Cache 困难得多。

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



AFAIK 没有。



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

  • getput 双向
  • 通过 forcePut 或通过 put 在冲突时抛出异常来保持双射性

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

    AFAIK 为了保持双射性,你需要锁。如果写入不太常见,那么您可以使用单个 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,但很简单,也许它也适用于您的缓存。

    10-08 02:25