Многие люди ссылаются на ConcurrentMap как на кеш.Могу ли я использовать 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-е-е) также кэшировать карту, и просто извлечь значение с карты?
Подобный ответ на этот post
Кроме того, я хотел бы знать, то .expiration(2L, TimeUnit.HOURS)
. Это действительно 2 часа, или длинные значения принимают за миллисекунды?
Пожалуйста, отредактируйте свой вопрос, чтобы указать, что вы используете Google Collections, это поможет людям ответить (да, я знаю, что вы отметили его как таковые) :-) –
Я не согласен. Я считаю, что этот вопрос по-прежнему действителен, если вы не используете MapMaker. Это все еще «ConcurrentMap» –