programing

심플한 Java 인메모리 캐시를 찾고 있다

procenter 2022. 10. 10. 20:51
반응형

심플한 Java 인메모리 캐시를 찾고 있다

동시성이 뛰어나고(LinkedHashMap은 충분하지 않으며), 주기적으로 디스크에 직렬화할 수 있는 단순한 Java 인메모리 캐시를 찾고 있습니다.

제가 필요로 하는 한 가지 기능은 찾기가 어렵지만, 사물을 " 훔쳐보는" 방법입니다.즉, 캐시가 다른 경우보다 더 오래 개체를 보유하지 않고 캐시에서 개체를 가져옵니다.

업데이트: 언급하지 않은 추가 요건은 캐시된 개체(플로트 어레이 포함)를 인플레이스로 변경할 수 있어야 한다는 입니다.

추천해주실 분 있나요?

이 질문이 처음 제기되었기 때문에 구글의 Guava 라이브러리는 강력하고 유연한 캐시를 포함하고 있습니다.이것을 사용하는 것을 추천합니다.

Ehcache는 매우 좋은 솔루션이며 아이돌타임 스탬프를 갱신하지 않도록 엿볼 수 있는 방법(getQuiet()이 메서드)이 있습니다.내부적으로 Ehcache는 Concurrent Hash Map과 같은 일련의 맵과 함께 구현되기 때문에 유사한 동시성 이점이 있습니다.

심플한 것이 필요하시면, 이 정도면 괜찮으시겠어요?

Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>());

디스크에는 저장되지 않지만, 당신은 단순한 것을 원한다고 말했다.

링크:

(Adam의 코멘트대로 맵을 동기화하면 퍼포먼스에 적중합니다.아이디어에 털이 없다고는 말하지 않지만, 빠르고 더러운 해결책으로 충분합니다.)

인메모리 Java 캐시의 또 다른 옵션은 cache2k입니다.인메모리 성능은 EHCache 및 Google guava보다 우수합니다. cache2k 벤치마크 페이지를 참조하십시오.

사용 패턴은 다른 캐시와 비슷합니다.다음은 예를 제시하겠습니다.

Cache<String,String> cache = new Cache2kBuilder<String, String>() {}
  .expireAfterWrite(5, TimeUnit.MINUTES)    // expire/refresh after 5 minutes
  .resilienceDuration(30, TimeUnit.SECONDS) // cope with at most 30 seconds
                                          // outage before propagating 
                                          // exceptions
  .refreshAhead(true)                       // keep fresh when expiring
  .loader(new CacheLoader<String, String>() {
    @Override
    public String load(final String key) throws Exception {
      return ....;
    }
  })
  .build();
String val = cache.peek("something");
cache.put("something", "hello");
val = cache.get("something");

구글 guava를 의존관계로 가지고 있다면 guava 캐시를 사용해 보는 것이 좋은 대안이 될 수 있습니다.

이것을 시험해 보세요.

import java.util.*;

public class SimpleCacheManager {

    private static SimpleCacheManager instance;
    private static Object monitor = new Object();
    private Map<String, Object> cache = Collections.synchronizedMap(new HashMap<String, Object>());

    private SimpleCacheManager() {
    }

    public void put(String cacheKey, Object value) {
        cache.put(cacheKey, value);
    }

    public Object get(String cacheKey) {
        return cache.get(cacheKey);
    }

    public void clear(String cacheKey) {
        cache.put(cacheKey, null);
    }

    public void clear() {
        cache.clear();
    }

    public static SimpleCacheManager getInstance() {
        if (instance == null) {
            synchronized (monitor) {
                if (instance == null) {
                    instance = new SimpleCacheManager();
                }
            }
        }
        return instance;
    }

}

imcache를 쉽게 사용할 수 있습니다.샘플 코드는 다음과 같습니다.

void example(){
    Cache<Integer,Integer> cache = CacheBuilder.heapCache().
    cacheLoader(new CacheLoader<Integer, Integer>() {
        public Integer load(Integer key) {
            return null;
        }
    }).capacity(10000).build(); 
}

jcabi-aspects에서 시도해보세요.단일 주석을 사용하여 전체 방법 결과를 메모리에 캐시할 수 있습니다.

public class Resource {
  @Cacheable(lifetime = 5, unit = TimeUnit.SECONDS)
  public String load(URL url) {
    return url.openConnection().getContent();
  }
}

또, 다음의 기사도 참조해 주세요.http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html

이것은 어떻습니까?https://commons.apache.org/proper/commons-jcs/ (JCS가 Apache Commons에 있기 때문에 새로운 주소로 이동합니다.

Ehcache를 사용하시겠습니까?Peek 기능을 제어할 수 있도록 자체 캐싱 만료 알고리즘을 연결할 수 있습니다.

디스크, 데이터베이스, 클러스터 간에 직렬화할 수 있습니다.

언급URL : https://stackoverflow.com/questions/575685/looking-for-simple-java-in-memory-cache

반응형