我正在寻找一个简单的Java内存缓存,它具有良好的并发性(因此LinkedHashMap不够好),并且可以定期序列化到磁盘。
我需要的一个功能,但事实证明很难找到,是一种“窥视”对象的方法。我的意思是从缓存中检索一个对象而不会导致缓存比对象更长时间地保留对象。
更新:我忽略了一个额外的要求是我需要能够就地修改缓存的对象(它们包含浮点数组)。
任何人都可以提供任何建议吗?
答案 0 :(得分:52)
由于最初询问此问题,Google's Guava library现在包含一个功能强大且灵活的缓存。我建议使用它。
答案 1 :(得分:36)
Ehcache是一个非常好的解决方案,有一种方法可以窥视(getQuiet()是方法),这样它就不会更新空闲时间戳。在内部,Ehcache使用一组地图实现,类似于ConcurrentHashMap,因此它具有类似的并发优势。
答案 2 :(得分:19)
如果你需要一些简单的东西,这是否符合要求?
Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>());
它不会保存到磁盘,但你说你想要简单......
链接:
(正如亚当评论的那样,同步一张地图会带来性能损失。不是说这个想法没有毛发,但足以作为一种快速而肮脏的解决方案。)
答案 3 :(得分:15)
内存中的java缓存的另一个选项是cache2k。 内存中的性能优于EHCache和google guava,请参阅cache2k benchmarks page。
使用模式与其他缓存类似。这是一个例子:
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");
如果你有谷歌番石榴作为依赖,那么尝试番石榴缓存,可能是一个很好的选择。
答案 4 :(得分:9)
您可以轻松使用imcache。示例代码如下。
void example(){
Cache<Integer,Integer> cache = CacheBuilder.heapCache().
cacheLoader(new CacheLoader<Integer, Integer>() {
public Integer load(Integer key) {
return null;
}
}).capacity(10000).build();
}
答案 5 :(得分:8)
试试这个:
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;
}
}
答案 6 :(得分:8)
从@Cacheable
尝试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
答案 7 :(得分:3)
这个怎么样:https://commons.apache.org/proper/commons-jcs/(更新到新地址,因为JCS现在在Apache Commons中)
答案 8 :(得分:0)
试试Ehcache?它允许您插入自己的缓存到期算法,以便您可以控制您的窥视功能。
您可以序列化到磁盘,数据库,跨群集等...