atomic пишет в ehcache

Контекст

Я храню java.util.List внутри ehcache.

Key(String) --> List<UserDetail>

Упорядоченный список содержит Топ-10 рейтинга моих самых активных пользователей.

Проблема

Параллельно работающие сторонние клиенты могут запрашивать этот список. У меня есть требование быть как можно более актуальным в отношении рейтинга. Таким образом, если рейтинг изменяется из-за действий пользователей, упорядоченный список в кэше не должен оставаться устаревшим очень долго. Как только я пересчитал новый список, я хочу немедленно заменить тот, который находится в кеше.

Рассмотрим загруженный сценарий, когда несколько одновременных клиентов запрашивают ранжирование; как я могу заменить элемент кеша таким образом, чтобы: Клиенты могли продолжать извлекать, возможно, устаревший снимок. Они никогда не должны получать нулевое значение.

Будет только 1 поток сервера, который записывает в кеш.


person Jacques René Mesrine    schedule 01.04.2010    source источник


Ответы (2)


Я не вижу, в чем проблема. Как только вы заменили элемент кеша, клиенты будут извлекать этот новый элемент кеша. До этого момента они будут извлекать старый элемент кеша.

Никогда не должно быть времени, когда они возвращают нулевой элемент кеша, если только вы фактически не удалите элемент из кеша, а затем не замените его.

Если бы EHCache работал так, я бы счел его в корне неработоспособным, учитывая, что он должен быть потокобезопасным!

person Community    schedule 01.04.2010
comment
Вы правы, javadoc для net.sf.ehcache.Cache говорит, что он потокобезопасен. К сожалению, я удаляю элемент кеша перед вызовом put. Я должен просто вызвать Cache.put(..). - person Jacques René Mesrine; 01.04.2010

Вы можете просто сохранить новый список в кеше. Следующий вызов get вернет его.

Все, что вы должны убедиться, это то, что никто не редактирует список, возвращаемый из кеша. Например, в потоке сервера вы должны скопировать список:

List workingCopy = new ArrayList ((List)cache.get(key));
... modify list ...
cache.put (key, workingCopy);
person Aaron Digulla    schedule 01.04.2010