2010-04-01 6 views
1

컨텍스트원자 쓰기는

I가 안쪽으로 Ehcache를 java.util.List 기억하고에게으로 Ehcache한다.

Key(String) --> List<UserDetail> 

주문 목록에는 가장 활동적인 사용자의 상위 10 위 순위가 포함됩니다.

문제

동시 타사 클라이언트는이 목록에 대한 요청 될 수 있습니다. 나는 순위와 관련하여 가능한 한 최신 정보를 제공해야한다는 요구 사항이 있습니다. 따라서 순위가 ​​사용자의 활동으로 인해 변경된 경우 캐시의 정렬 된 목록을 오래 동안 낡은 상태로 두어서는 안됩니다. 일단 새 List를 다시 계산하면 즉시 캐시에있는 List를 교체하려고합니다.

여러 동시 클라이언트가 순위를 요청하는 바쁜 시나리오를 고려하십시오. 다음과 같은 방식으로 캐시 항목을 어떻게 대체 할 수 있습니까? 클라이언트가 부실 스냅 샷을 계속 가져올 수 있습니다. 그들은 결코 null 값을 가져서는 안됩니다.

캐시에 쓰는 서버 스레드는 하나뿐입니다.

답변

4

문제가 무엇인지 모르겠습니다. 캐시 항목을 교체하면 클라이언트는 새 캐시 항목을 가져옵니다. 그 시점까지 이전 캐시 항목을 가져옵니다.

실제로 캐시에서 항목을 제거한 다음 대체하는 경우가 아니면 널 캐시 항목을 반환 할 시간이 없어야합니다.

EHCache가 이와 같이 작동하면 스레드 안전성이 보장되므로 근본적으로 문제가 있다고 생각합니다.

+1

바로 net.sf.ehcache.Cache에 대한 javadoc은 스레드로부터 안전하다고 말합니다. 불행히도 put을 호출하기 전에 캐시 항목을 제거합니다. Cache.put (..) 만 호출하면됩니다. –

3

캐시에 새 목록을 저장하기 만하면됩니다. 다음에 get을 호출하면 반환됩니다.

모두 캐시에서 반환 된 목록을 편집하지 않아야합니다. 예를 들어 서버 스레드에서 목록을 복사해야합니다.

List workingCopy = new ArrayList ((List)cache.get(key)); 
... modify list ... 
cache.put (key, workingCopy);