심플한 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
'programing' 카테고리의 다른 글
Laravel 요구::all()을 스태틱하게 호출하지 말 것 (0) | 2022.10.10 |
---|---|
Maria DB 도커 액세스가 사용자 'root'@'localhost'에 대해 거부되었습니다. (0) | 2022.10.10 |
phpMyAdmin을 통해 원격 사용자 허용 (0) | 2022.10.10 |
특정 테이블의 MySQL 엔진 유형을 확인하려면 어떻게 해야 합니까? (0) | 2022.10.10 |
파일을 다운로드하지 않은 원격 파일 크기 (0) | 2022.10.10 |