질문
Java 메모리 내 개체 캐싱 API를 찾고 있습니다. 권장 사항이 있습니까? 과거에 어떤 솔루션을 사용 했습니까?
흐름
지금은지도를 사용하고 있습니다.
Map cache = new HashMap<String, Object>();
cache.put("key", value);
요구 사항
다음과 같은 기본 기능을 포함하도록 캐시를 확장해야합니다.
- 최대 크기
- 살 시간
그러나 다음과 같은 더 정교한 기능은 필요하지 않습니다.
- 여러 프로세스에서 액세스 (캐싱 서버)
- 지속성 (디스크로)
제안
인 메모리 캐싱 :
- Guava CacheBuilder-활발한 개발. 이 프레젠테이션을 참조하십시오 .
- LRUMap -API를 통한 구성. TTL이 없습니다. 캐싱을위한 목적이 아닙니다.
- whirlycache -XML 구성. 메일 링리스트. 마지막 업데이트 2006.
- cache4j -XML 구성. 러시아어로 된 문서. 마지막 업데이트 2006.
엔터프라이즈 캐싱 :
답변
EHCache 는 매우 좋습니다. 메모리 캐시를 만들 수 있습니다. 메모리 내 캐시를 만드는 예제는 코드 샘플 을 확인하십시오 . 최대 크기와 수명을 지정할 수 있습니다.
EHCache는 몇 가지 고급 기능을 제공하지만 사용에 관심이 없다면 사용하지 마십시오. 그러나 요구 사항이 변경 될 때도 있다는 것을 아는 것이 좋습니다.
다음은 메모리 캐시입니다. 구성 파일없이 코드로 생성되었습니다.
CacheManager cacheManager = CacheManager.getInstance();
int oneDay = 24 * 60 * 60;
Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
cacheManager.addCache(memoryOnlyCache);
200 개의 요소를 보유하고 ttl이 24 시간 인 캐시를 만듭니다.
답변
Google Guava ( API ) MapMaker
와 함께 제공되는 기능이 정말 마음에 듭니다.
JavaDoc에는 사용의 용이성과 성능을 모두 보여주는 매우 깔끔한 예제가 있습니다.
ConcurrentMap<Key, Graph> graphs = new MapMaker()
.concurrencyLevel(32)
.softKeys()
.weakValues()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(
new Function<Key, Graph>() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});
또한 Guava 릴리스 10.0은 훨씬 더 광범위한 com.google.common.cache
패키지를 도입했습니다 ( 사용 방법에 대한 멋진 위키 항목이 있습니다 ).
답변
다음 사이트에서 KittyCache라는 작은 캐시 라이브러리를 확인할 수도 있습니다.
https://github.com/treeder/kitty-cache
ehcache와 비교하여 몇 가지 성능 벤치 마크가 있습니다.
그것은에 사용되는 SimpleJPA의 두 번째 레벨 캐시와 같은 프로젝트.
답변
LinkedHashMap을 확인하여 타사 jar없이 간단한 캐시를 구현할 수 있습니다.
Map <String, Foo> cache = new LinkedHashMap<String, Foo>(MAX_ENTRIES + 1, .75F, true) {
public boolean removeEldestEntry(Map.Entry<String, Foo> eldest) {
return size() > MAX_ENTRIES;
}
};
그런 다음 캐시에서 다음과 같이 얻을 수 있습니다.
Foo foo = cache.get(key);
if (foo == null && !cache.containsKey(key)) {
try {
FooDAO fooDAO = DAOFactory.getFooDAO(conn);
foo = fooDAO.getFooByKey(key);
cache.put(key, foo);
} catch (SQLException sqle) {
logger.error("[getFoo] SQL Exception when accessing Foo", sqle);
}
}
독자를위한 운동으로 남은 휴식 🙂
답변
Guava의 MapMaker 는 CacheBuilder 클래스 로 대체되었습니다 .
답변
JCS 는 시도되고 사실입니다. 캐싱 메커니즘이 가볍지 만 실제 코드를 파헤쳐 서 HashMap으로 수행하는 작업을 정확히 필요한 것만 모방 할 수 있습니다. 당신은 당신이 찾고있는 것에 대해 꽤 좋은 아이디어를 가지고있는 것 같습니다.
답변
memcached에는 Java 용 클라이언트가 있습니다. http://www.danga.com/memcached/ 캐싱 서버가 되려면 별도의 프로세스가 필요하지만 강력한 기능입니다.
