source

경량 Java 객체 캐시 API

factcode 2022. 9. 3. 13:12
반응형

경량 Java 객체 캐시 API

질문.

Java in-memory 객체 캐싱 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개의 요소를 저장할 수 있는 24시간의 ttl 캐시를 만듭니다.

Google Guava(API)에 부속되어 있는 것이 매우 마음에 듭니다.

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에서는, 보다 광범위한 패키지가 도입되었습니다(사용 방법에 관한 Wiki 엔트리가 있습니다).

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

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

퍼포먼스 벤치마크와 ehcache의 비교가 있습니다.

SimpleJ에서 사용되고 있습니다.세컨드 레벨의 캐시로서 PA 프로젝트를 실시합니다.

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

합참은 시도되고 있습니다.캐싱 메커니즘에 관한 한 가볍지만 실제 코드를 조사하여 HashMap에서 수행하는 작업을 그대로 모방할 수 있습니다.당신은 당신이 찾고 있는 것에 대해 꽤 잘 알고 있는 것 같군요.

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

언급URL : https://stackoverflow.com/questions/230649/lightweight-java-object-cache-api

반응형