当前位置:  开发笔记 > 编程语言 > 正文

寻找简单的Java内存缓存

如何解决《寻找简单的Java内存缓存》经验,为你挑选了7个好方法。

我正在寻找一个简单的Java内存缓存,它具有良好的并发性(因此LinkedHashMap不够好),并且可以定期序列化到磁盘.

我需要的一个功能,但事实证明很难找到,是一种"窥视"对象的方法.我的意思是从缓存中检索一个对象而不会导致缓存比其他方式更长时间地保留对象.

更新:我忽略的另一个要求是我需要能够就地修改缓存的对象(它们包含浮点数组).

有人可以提供任何建议吗?



1> sanity..:

由于这个问题最初被问到,谷歌的Guava库现在包含一个强大而灵活的缓存.我建议使用这个.



2> Alex Miller..:

Ehcache是一个非常好的解决方案,有一种方法可以窥视(getQuiet()是方法),这样它就不会更新空闲时间戳.在内部,Ehcache使用一组地图实现,类似于ConcurrentHashMap,因此它具有类似的并发优势.


谢谢,还有一个问题:如果我从EHcache(比如一个数组)中检索一个对象并修改它,那么该对象是否会在缓存中更新?即.EHCache是​​否维护对象的引用?

3> Evan..:

如果你需要一些简单的东西,这是否符合要求?

Map myCache = Collections.synchronizedMap(new WeakHashMap());

它不会保存到磁盘,但你说你想简单...

链接:

Collections.synchronizedMap

WeakHashMap中

(正如亚当评论的那样,同步地图会带来性能损失.并不是说这个想法没有毛发,但是足以作为快速而肮脏的解决方案.)


性能方面,ConcurrentHashMap绝对性能更好,但它不会共享WeakHashMap的属性,只允许垃圾回收器回收内存.这对您来说可能重要,也可能不重要.
ConcurrentHashMap优于Collections.synchronizedMap http://stackoverflow.com/questions/6692008/java-concurrenthashmap-is-better-than-hashmap-performance-wise
然后使用`ConcurrentHashMap >`.http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html
同步整个巨大的地图是一个沉重的惩罚.您可以轻松地在并发哈希映射中存储弱类型并定期删除它们.

4> cruftex..:

内存中的java缓存的另一个选择是cache2k.内存性能优于EHCache和google guava,请参阅cache2k基准测试页面.

使用模式与其他缓存类似.这是一个例子:

Cache cache = 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");

如果你有谷歌番石榴作为依赖,然后尝试番石榴缓存,可能是一个很好的选择.



5> yusufaytas..:

你可以轻松使用imcache.示例代码如下.

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



6> Serhii Bohut..:

试试这个:

import java.util.*;

public class SimpleCacheManager {

    private static SimpleCacheManager instance;
    private static Object monitor = new Object();
    private Map cache = 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;
    }

}



7> yegor256..:

尝试@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

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有