지도

2011-10-13 4 views
7

나는 Map (또는 컬렉션) 항목에 대해 타임 - 투 - 아이들을 지원하고 자동으로 제거해야합니다.지도

나는 구아바 MapMaker가 알고 있지만 실행중인 스레드에 의해, 오히려 자동보다는 이후의 읽기/쓰기 작업에 요소를 만료됩니다. 또한 MapMaker의 만료 기능이 CacheBuilder으로 이동되었습니다. 뭔가가 바로 사용할 수 있습니까 만료되는 요소

합니다 - 문제는 내가 캐시를하지 않으입니까? (직접 구현하는 것이 어렵지 않지만 재사용하는 것이 더 낫습니다.)

+0

는 "다이"어떻게 든 명시 적으로 요소가 필요하십니까 시간에 (예를 들어, 일부 메서드를 호출하여)? 만료 된 요소를 버리면 액세스 시간에 요소의 시간 소인을 확인하면 충분합니다. – 9000

+1

실행중인 스레드가 주기적으로 Cache.cleanup()을 호출하여 만료 된 항목의 제거를 트리거 할 수 있습니다. 즉각적인 것은 아니지만, 실행중인 스레드는 내부적으로 너무 많은 제한 사항 (J2EE/GAE 호환이 아니고, 도그 효과 (dogpile effect) 등으로 고통 받음)이있었습니다. –

+0

@Ben Manes가 제안에 감사드립니다. 그러나 캐시 인터페이스가 마음에 들지 않습니다. 첫째, 값 계산을 지정해야합니다. 나는 그것을 필요로하지 않는다. null을 반환하면 NPE가 throw됩니다. 그것은 항상 getOrCompute를 호출하고 있기 때문에 그것이 필요합니다 - 그냥 간단한지도처럼. 그런 다음 NPE를 잡아도 작동 할 수는 없지만 (아마도 내 잘못) 액세스 한 경우에도 항상 항목이 만료되었습니다. – Bozho

답변

2

http://code.google.com/p/concurrentlinkedhashmap/wiki/ExpirableCache
오히려 ... 많은 미해결 임포트가 있습니다. 다른 아무것도, 당신은 단지 예외를 throw 더미 CacheLoader를 제공 할 수없는 경우

+0

좋은 만료됩니다, 나는 그것의가 (구) 시범 튜토리얼 대신 제공되는 라이브러리, 그래서 해결되지 않은 수입은 공정 듯 내일 – Bozho

+0

를 확인할 수 있습니다. 그것의 순진하고 일반적인 접근 방식. 나는 구아바에 추가 한 상환 된 방법을 선호한다. 부패한 사건이 쌓이는 것을 피하기 때문이다. –

2

, 그럼 그냥 Cache.get를 호출하지 않습니다 - 단지 asMap보기와 상호 작용합니다. 은 꽤이 아니지만 11.0에서는이 사례를 더 잘 지원하기 위해 노력하고 있습니다. 이것을 시도하면 구아바 10.0.1을 가지고 있는지 확인하십시오. 당신이 원하는 어느 스레드에서 원하는대로 자주 전화하는

그리고 네, Cache.cleanUp이있다.

+0

가이를 시도했지만, 'asMap' 뷰 상호 작용은 마지막 액세스를 새로 고치지 않습니다. – Bozho

0

아파치 미나의 ExpiringMap이 당신이 찾고있는 바로 그 것입니다.

http://mina.apache.org/mina-project/apidocs/org/apache/mina/util/ExpiringMap.html

+2

링크 전용 답변은 최고의 답변이 아닙니다.작은 코드 샘플을 제공하여 확장 할 수 있습니까? –

+0

[ExpiringMap] (https://github.com/jhalterman/expiringmap)을 확인하십시오. 생성 또는 액세스 시간을 기준으로 항목을 만료시킬 수 있습니다. – Jonathan

0

나는 Hazelcast가 제공하는 Map를 사용하는 것이 좋습니다. 또한 분산 기능을 제공하지만 어쩌면 당신은 그들에게 관심이 없습니다. 만료 정책 (time-to-live-secondsmax-idle-seconds)을 구성하고 Map을 Java의 HashMap처럼 사용할 수 있습니다.

더 많은 정보는 여기에서 찾을 수 있습니다 : Hazelcast Distributed Map