寻找简单的Java内存caching
我正在寻找一个简单的具有良好并发性的Java内存caching(因此LinkedHashMap不够好),并且可以定期将其序列化到磁盘。
我需要一个function,但是很难find,这是一种“偷看”物体的方法。 通过这个我的意思是从caching中检索一个对象,而不会导致caching保持对象的时间比它否则会。
更新:我忽略了一个额外的要求是,我需要能够在原地修改caching的对象(它们包含浮点数组)。
任何人可以提供任何build议?
由于这个问题最初是被问到的, Google的Guava库现在包含了一个强大且灵活的caching。 我会build议使用这个。
Ehcache是一个非常好的解决scheme,并有一个方法来查看( getQuiet()是方法),使它不更新空闲时间戳。 在内部,Ehcache是用一组映射来实现的,类似于ConcurrentHashMap,所以它具有类似的并发优点。
如果你需要一些简单的东西,这是否符合法案?
Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>());
它不会保存到磁盘,但你说你想要简单…
链接:
- Collections.synchronizedMap
- WeakHashMap中
(正如亚当所说,同步一张地图的performance受到了打击,并不是说这个想法没有头发,但是作为一个快速和肮脏的解决scheme就足够了。
内存中的Javacaching的另一个select是cache2k 。 内存中的性能优于EHCache和谷歌番石榴,请参阅cache2k基准testing页面 。
使用模式与其他caching类似。 这里是一个例子:
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");
如果你有谷歌番石榴作为依赖,然后尝试番石榴caching,可能是一个很好的select。
尝试这个:
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-方面尝试@Cacheable
。 使用单个注释可以使整个方法在内存中caching:
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 ? 它允许你插入你自己的caching到期algorithm,所以你可以控制你的peekfunction。
您可以序列化到磁盘,数据库,跨集群等…