2014-09-21 57 views
3

我在數據庫中有一個簡單的映射表,它將整數鍵與某些值相關聯。一旦我將這些價值觀粘在桌子上,他們就永遠不會消失。我想使用Guava Cache,這樣這些鍵可以查找一次,然後保持存儲在內存中。它看起來像番石榴Cache將允許我輕鬆地做到這一點。不過,我需要映射兩種方式:從鍵到值,從值到鍵,如BiMapGuava Cache的BiMap功能?

是否有一種簡單的方法可以使用Cache獲得BiMap功能,還是必須推出我自己的解決方案?

是否有允許併發訪問的BiMap實現,或者如果我想要高效的多線程訪問,我將不得不使用讀寫鎖?

回答

1

有沒有簡單的方法使用緩存來獲取BiMap功能,還是必須推出自己的解決方案?

Maps.synchronizedBiMap,但我不認爲這是很好的起點,如添加所有Cache能力可能比添加BiCache方式更難。

它也只是同步,而不是併發。

是否有BIMAP實現,允許併發訪問,

AFAIK沒有。

或者如果我想要高效的多線程訪問,我將不得不使用讀寫鎖嗎?

我想,這取決於你需要的功能BiMap的哪一部分。該BiMap允許你在兩個方向

  • 要麼通過forcePut或通過put保持雙射在衝突
  • 拋出一個異常,如果你確信沒有衝突可能永遠

    • getput發生,那麼它並不複雜。也許你需要的是搭載兩個緩存,就像我做的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); 
      

      這是一個有點哈克,但簡單,也許適用於您的緩存。

    相關問題