Java-кеш с истечением срока действия с момента первой записи
У меня есть события, которые должны быть собраны в постоянное хранилище значений ключей. Через 24 часа после первой вставки ключа эта накопленная запись должна быть обработана и удалена из хранилища. Обработка данных с истекшим сроком действия распределяется между несколькими узлами, поэтому использование базы данных связано с проблемами синхронизации обработки. Я не хочу использовать любую базу данных SQL. Для меня лучше всего подойдет кеш с настраиваемой политикой истечения срока действия в соответствии с моими потребностями. Есть ли? Или это можно решить с помощью некоторой базы данных No-SQL?
1 ответ
Это должно быть возможно с такими продуктами, как http://infinispan.org/ или hazelcast.
Оба совместимы с JSR107.
С JSR107-совместимым API-интерфейсом кеширования возможный подход состоит в том, чтобы установить 24-часовой срок действия через CreatedExpiryPolicy. Затем вы реализуете и регистрируете CacheEntryExpiredListener, чтобы получить вызов по истечении срока действия записи.
Вызов CacheEntryExpiredListener может быть снисходительным и зависящим от реализации. На самом деле событие вызвано "выселением из-за истечения срока действия". Например, одна реализация может выполнять сканирование перидока и удалять просроченные записи каждые 30 минут. Однако я думаю, что "время задержки" настраивается в большинстве реализаций, поэтому вы сможете работать в определенных пределах.
Также проверьте, есть ли какие-то ограничения ресурсов для обратных вызовов событий, с которыми вы можете столкнуться, например, пулы потоков.
Я упомянул infispan или hazelcast по двум причинам:
- Вам могут понадобиться возможности распространения.
- Поскольку вы выполняете длительную обработку и сохраняете данные, которые невозможно восстановить, вам могут потребоваться функции сохранения и отказоустойчивости. Поэтому я бы сказал, что простой кэш в памяти, такой как Google Guava, выходит за рамки.
Удачи!