我正在寻找一个简单的Java内存缓存,它具有良好的并发性(因此LinkedHashMap不够好),并且可以定期序列化到磁盘.
我需要的一个功能,但事实证明很难找到,是一种"窥视"对象的方法.我的意思是从缓存中检索一个对象而不会导致缓存比其他方式更长时间地保留对象.
更新:我忽略的另一个要求是我需要能够就地修改缓存的对象(它们包含浮点数组).
有人可以提供任何建议吗?
由于这个问题最初被问到,谷歌的Guava库现在包含一个强大而灵活的缓存.我建议使用这个.
Ehcache是一个非常好的解决方案,有一种方法可以窥视(getQuiet()是方法),这样它就不会更新空闲时间戳.在内部,Ehcache使用一组地图实现,类似于ConcurrentHashMap,因此它具有类似的并发优势.
如果你需要一些简单的东西,这是否符合要求?
MapmyCache = Collections.synchronizedMap(new WeakHashMap ());
它不会保存到磁盘,但你说你想简单...
链接:
Collections.synchronizedMap
WeakHashMap中
(正如亚当评论的那样,同步地图会带来性能损失.并不是说这个想法没有毛发,但是足以作为快速而肮脏的解决方案.)
内存中的java缓存的另一个选择是cache2k.内存性能优于EHCache和google guava,请参阅cache2k基准测试页面.
使用模式与其他缓存类似.这是一个例子:
Cachecache = new Cache2kBuilder () {} .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 () { @Override public String load(final String key) throws Exception { return ....; } }) .build(); String val = cache.peek("something"); cache.put("something", "hello"); val = cache.get("something");
如果你有谷歌番石榴作为依赖,然后尝试番石榴缓存,可能是一个很好的选择.
你可以轻松使用imcache.示例代码如下.
void example(){ Cachecache = CacheBuilder.heapCache(). cacheLoader(new CacheLoader () { public Integer load(Integer key) { return null; } }).capacity(10000).build(); }
试试这个:
import java.util.*; public class SimpleCacheManager { private static SimpleCacheManager instance; private static Object monitor = new Object(); private Mapcache = Collections.synchronizedMap(new HashMap ()); 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; } }
尝试@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