2013-11-28 8 views
1

Jersey를 사용하여 RESTful 웹 서비스를 개발 중이며 타이머를 기반으로 데이터베이스에서 레코드를 검색하여 데이터를 업데이트하는 간단한 개체 캐시를 사용하려고합니다. 나는이 캐시에 내 검색된 데이터를 저장하기 위해 HashMap을 사용할 계획이지만 내 질문은이 HashMap을 업데이트하는 가장 좋은 방법이다.Object Cache 용 HashMap 업데이트를위한 모범 사례

지금 당장 내 선택은 HashMap을 휘발성으로 만들고 업데이트가 들어올 때마다 새로운 HashMap을 만든 다음 그것이 완료 될 때마다 할당합니다. 또한 동기화 된 블록에서 HashMap을 래핑하거나 HashMap 변수를 직접 업데이트하는 동안 ReentrantReadWriteLock을 사용할 수 있습니다. 또한 성능상의 이점이있는 ConcurrentHashMap을 사용하려고 생각했습니다. 이러한 접근법 중 하나를 다른 접근법보다 사용하는 데있어 중요한 성능 차이 및/또는 단점이 있습니까?

또한 사용자가 웹 서비스 API를 통해 레코드를 업데이트하거나 삽입 할 때 DB에 레코드를 저장하거나 다른 큰 데이터 검색을 수행하도록 설정하면 로컬 캐시를 직접 업데이트하는 것이 가장 좋습니다.

답변

0

ConcurrentLinkedHasHMap을 사용하면 LIRS 알고리즘을 사용합니다.

ConcurrentLinkedHashMap 구현은 원래 Doug Lea가 코딩하고 OpenJDK 1.6.0_0에서 발견 된 ConcurrentHashMap 구현의 조정 된 버전입니다. ConcurrentMap 인터페이스의 동시 해시 맵 및 링크 된 목록 구현을 예측 가능한 반복 순서로 제시합니다. 이 구현은 ConcurrentHashMap과 달리 모든 항목을 통해 실행되는 이중 연결 목록을 유지 관리합니다. 이 링크 된 목록은 일반적으로 키가 맵에 삽입 된 순서 (삽입 순서) 인 반복 순서를 정의합니다. 키가 맵에 다시 삽입되면 삽입 순서가 영향을받지 않습니다.

2

HashMap 대신 Guava' 캐시를 사용하는 것이 훨씬 더 구성 가능하고 데이터를 캐시하려는 의도를 문서화하는 것이 좋습니다. this 예제를 읽으십시오.

+0

예제를 읽으십시오. 그러나 매분마다 DB에서 새 데이터를 읽는 중이므로 성능상의 이점이 확실하지 않습니다. 내 API를 통해 전체 목록을 반환합니다 (이벤트 일정을 생각해보십시오). 언급 한 예제는 특정 값을 캐싱하기위한 것입니다. – Justin