경량 자바 객체 캐시 API [닫기]


99

질문

Java 메모리 내 개체 캐싱 API를 찾고 있습니다. 권장 사항이 있습니까? 과거에 어떤 솔루션을 사용 했습니까?

흐름

지금은지도를 사용하고 있습니다.

Map cache = new HashMap<String, Object>();
cache.put("key", value);

요구 사항

다음과 같은 기본 기능을 포함하도록 캐시를 확장해야합니다.

  • 최대 크기
  • 살 시간

그러나 다음과 같은 더 정교한 기능은 필요하지 않습니다.

  • 여러 프로세스에서 액세스 (캐싱 서버)
  • 지속성 (디스크로)

제안

인 메모리 캐싱 :

  • Guava CacheBuilder-활발한 개발. 이 프레젠테이션을 참조하십시오 .
  • LRUMap -API를 통한 구성. TTL이 없습니다. 캐싱을위한 목적이 아닙니다.
  • whirlycache -XML 구성. 메일 링리스트. 마지막 업데이트 2006.
  • cache4j -XML 구성. 러시아어로 된 문서. 마지막 업데이트 2006.

엔터프라이즈 캐싱 :

  • JCS- 속성 구성. 광범위한 문서.
  • Ehcache -XML 구성. 광범위한 문서. 구글 히트에 따르면 지금까지 가장 인기가 있습니다.

3
Guava 캐시를 포함하도록 메모리 내 캐싱 제안 섹션을 편집 할 수 있습니까? 나는 당신과 같은 가벼운 캐싱 메커니즘을 찾고 있었고이 질문을 찾았지만 구아바를 찾지 못했습니다. 이제 저는 구아바 캐시 패키지를 사용하고 있습니다.
andras 2011

1
끝난. :-) 당신이 그것을 좋아하는 것이 매우 기쁩니다!
Kevin Bourrillion 2012-06-08

상대적으로 새로운 cache2k 추가를 고려할 수도 있습니다 . 자신에 벤치 마크 페이지 그것으로 Ehcache와 구아바보다 훨씬 더 나은 성능을 가지고 있다고한다.
user3001 2014

답변:


57

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 시간 인 캐시를 만듭니다.


2
EHCache가 객체를 참조하거나 직렬화 한 다음 대신 직렬화 해제합니까?
Phương Nguyễn

2
EHCache는 헤비급 솔루션입니까? Android에서 API 캐시를 구현하기 위해 기존 캐싱 솔루션을 조사하고 있습니다.
Matthias

2
Android에 비해 너무 무겁습니다. 나는 키티 캐시를 사용하고 있으며 너무 완벽합니다!
Felipe 2011 년

@Stevet K,이 캐시 기술을 알고 늦었지만 getInstance ()가 제거되거나 변경된 것 같습니다.
Menai Ala Eddine-Aladdin

46

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패키지를 도입했습니다 ( 사용 방법에 대한 멋진 위키 항목이 있습니다 ).



@mxttie : 감사합니다. 링크를 추가했습니다. 이와 같은 추가에 대한 편집을 자유롭게 제안하십시오.
Joachim Sauer

10

다음 사이트에서 KittyCache라는 작은 캐시 라이브러리를 확인할 수도 있습니다.

https://github.com/treeder/kitty-cache

ehcache와 비교하여 몇 가지 성능 벤치 마크가 있습니다.

그것은에 사용되는 SimpleJPA의 두 번째 레벨 캐시와 같은 프로젝트.


1
좋지만 TTL 만 있으면 좋습니다.
Rosdi Kasim

감사 ! 내가 이전에 입력 된 코드 만 사람이 :) 이미 열려 소스 화 뭔가를 가지고 있는지 확인하는 생각
jpillora

@RosdiKasim 실제로 put () 호출에 TTL이 있습니다. 예 : cache.put ( "mykey", value, 500); 500은 TTL입니다.
Travis Reeder

1
@TravisR 음 ..., 그 당시에는 TTL이 없었습니다. : p
Rosdi Kasim

아, 그 댓글이 얼마나 오래 전인지 몰랐습니다.
Travis Reeder 2012

9

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

독자를위한 운동으로 남은 휴식 :)


2
이 방법에는 TTL 용량이 없다고 생각합니다. 그래도 자신의 롤링을 향한 좋은 시작이 될 것입니다.
Chase Seibert

예, 저는 독자 실습의 일부로 TTL 항목을 남겨 둘 것입니다 : p-물론 타사 라이브러리는 사용자가 직접 롤링하는 것보다 훨씬 더 많은 테스트를 거쳤을 것입니다.
JeeBee


5

JCS 는 시도되고 사실입니다. 캐싱 메커니즘이 가볍지 만 실제 코드를 파헤쳐 서 HashMap으로 수행하는 작업을 정확히 필요한 것만 모방 할 수 있습니다. 당신은 당신이 찾고있는 것에 대해 꽤 좋은 아이디어를 가지고있는 것 같습니다.


캐싱 메커니즘이 진행되는 한 가볍지 않다는 것을 의미 합니까? 하지만 가장 인기있는 엔터프라이즈 솔루션 중 하나 인 것 같습니다.
Chase Seibert

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.