2010-11-01 6 views
1

Многие люди ссылаются на 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 часа, или длинные значения принимают за миллисекунды?

+0

Пожалуйста, отредактируйте свой вопрос, чтобы указать, что вы используете Google Collections, это поможет людям ответить (да, я знаю, что вы отметили его как таковые) :-) –

+0

Я не согласен. Я считаю, что этот вопрос по-прежнему действителен, если вы не используете MapMaker. Это все еще «ConcurrentMap» –

ответ

2

Я лично считаю, что хранить такой кеш в вашем ApplicationContext хорошо, поскольку он является потокобезопасным. Но помните о размере кеша, особенно если вы являетесь кластером и т. Д.

По истечении срока истечения 2 часа, как и следовало ожидать.

Смежные вопросы