可以/应该将ConcurrentMap与我自己的缓存一起使用吗?

时间:2010-11-01 15:12:38

标签: java caching java-ee guava

很多人将ConcurrentMap称为缓存。

这样做是个好主意:

public List<Task> listTasks(final ProcessDefinition def, final boolean filterEnumerated) {
    final String CACHENAME = def.getName() + "-v" + def.getVersion() + "-Tasks";
    ConcurrentMap<String, List<Task>> cache = (ConcurrentMap<String, List<Task>>) Contexts.getApplicationContext().get(CACHENAME);
    if (Contexts.getApplicationContext().isSet(CACHENAME) && cache != null) {
        return cache.get(CACHENAME);
    } else {

        ConcurrentMap<String, List<Task>> myTasks = new MapMaker()
           .softValues()
           .expiration(2L, TimeUnit.HOURS)
           .makeComputingMap(
               new Function<String, List<Task>>() {
                @Override
                public List<Task> apply(String from) {
                    return getTasksFromDefinition(def, filterEnumerated);
                }
               });

        myTasks.put(CACHENAME, getTasksFromDefinition(def, filterEnumerated));

        Contexts.getApplicationContext().set(CACHENAME,myTasks);
        Collection<List<Task>> tz = myTasks.values();
        //First element in the collection
        return new ArrayList<Task>(tz.iterator().next());
    }
}

或者是否有必要使用ApplicationContext(也就是java-ee应用程序上下文)来缓存地图,只是从地图中检索值?
与此post

的答案相似

我也想知道,.expiration(2L, TimeUnit.HOURS)。这真的是2小时,还是以毫秒为单位的长值?

1 个答案:

答案 0 :(得分:2)

我个人认为将这样的缓存存储在ApplicationContext中是好的,因为它是线程安全的。但要注意缓存的大小,特别是如果你是群集等。

在到期问题上,到期时间是2小时,正如您所期望的那样。