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

질문

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 구성. 광범위한 문서. 구글 히트에 따르면 지금까지 가장 인기가 있습니다.


답변

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의 MapMakerCacheBuilder 클래스 로 대체되었습니다 .


답변

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


답변

memcached에는 Java 용 클라이언트가 있습니다. http://www.danga.com/memcached/ 캐싱 서버가 되려면 별도의 프로세스가 필요하지만 강력한 기능입니다.