атомарный пишет в ehcache - PullRequest
1 голос
/ 01 апреля 2010

Context

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

Key(String) --> List<UserDetail>

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

Задача

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

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

Там будет только 1 серверный поток, который пишет в кэш.

Ответы [ 2 ]

4 голосов
/ 01 апреля 2010

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

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

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

3 голосов
/ 01 апреля 2010

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

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

List workingCopy = new ArrayList ((List)cache.get(key));
... modify list ...
cache.put (key, workingCopy);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...