2014-09-21 2 views
3

정수 키를 특정 값과 연결하는 데이터베이스에 간단한 매핑 테이블이 있습니다. 테이블에 값을 붙이면 결코 사라지지 않습니다. Guava Cache을 사용하여 이러한 키를 한 번 조회 한 다음 메모리에 저장하는 것이 좋습니다. 구아바 Cache처럼 보입니다. 이렇게 쉽게 할 수 있습니다. 그러나 저는 두 가지 방법을 매핑해야합니다 : 키에서 값으로, 값에서 키로 매핑하십시오 (예 : BiMap).Guava 캐시의 BiMap 기능은 무엇입니까?

Cache을 사용하여 BiMap 기능을 사용하는 간단한 방법이 있습니까? 아니면 내 솔루션을 롤업해야합니까?

동시 액세스를 허용하는 BiMap 구현이 있습니까? 아니면 효율적인 멀티 스레드 액세스를 원한다면 읽기 - 쓰기 잠금을 사용해야합니까?

답변

1

캐시를 사용하여 BiMap 기능을 사용하는 간단한 방법이 있습니까? 아니면 자체 솔루션을 롤업해야합니까? 모든 Cache 기능을 추가하는 것은 아마 방법 세게 CacheBi을 추가하는 것보다 한,

Maps.synchronizedBiMap있다,하지만 난 그게 좋은 출발점이 있다고 생각하지 않습니다.

동시에 동기화되지도 않습니다.

동시 액세스를 허용하는 BiMap 구현이 있는가,

없는 AFAIK.

효율적이거나 멀티 스레드 액세스를 원한다면 읽기/쓰기 잠금을 사용해야합니까?

내 생각에, 당신이 필요로하는 기능은 BiMap입니다. BiMap 당신에게

  • 당신이 그 충돌없이 이제까지 않을 수 있는지 경우 충돌
  • 에 예외를 던지는 중 하나 forcePut를 통해 또는 put를 통해 bijectivity을 보존하기 위해 양 방향으로

      get-
    • put 수 있습니다 그런 다음 그렇게 복잡한 것은 아닙니다. 두 번째 캐시를 피기 백하는 것만이라면 here처럼 할 수 있습니다.


      AFAIK는 독서력을 유지하기 위해 잠금 장치가 필요합니다. 쓰기가 너무 흔하지 않은 경우에는 ReadWriteLock을 사용하면 빠르게 완료됩니다. 그렇지 않으면 ...

      최대 동시성을 위해 Striped을 사용할 수는 있지만 키와 값에 따라 스트라이프를 잠글 필요가 있으므로 너무 까다 롭습니다. 이전 값인 forcePut의 경우도 마찬가지입니다.내가 BiMap 사용 때마다


      , 나는 나중에 발견하거나 실제로 두 개 이상의 다른 방법으로 뭔가 (일부 2 차 키) 또는 내가 몇 가지 추가 정보를 얻을 필요가 있음을 얻을 필요가있다. 그래서 그것은 조금 해키,하지만 간단

      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); 
      

      같은 클래스에서 두 개 또는 세 개의 맵으로 변환 어쩌면 그것은뿐만 아니라 캐시에 적용됩니다.