Недавно мы начали использовать EHCache с Terracotta для запуска распределенного кеша данных для данных приложения. Предположим, что любой клиентский узел имеет около 2 ГБ для своих куч, тогда как серверные узлы имеют 8 ГБ. Мы генерируем много данных, около 1,5 ГБ в день.
Как правило, любой клиент будет использовать набор данных за определенный день (около 1,5 ГБ), но сервер, очевидно, должен хранить их все.
Я бы хотел, чтобы истечение срока действия работало на основе LRU, когда куча становится большой. Поэтому, если какой-либо конкретный кэш на стороне клиента L1 становится слишком большим (скажем, при переключении с дня 1 на день 2), я ожидаю, что он вытеснит из L1 все данные дня 1. Если L2 становится слишком большим, когда мы получаем 6-й набор данных, срок действия самого старого набора данных полностью истечет. На самом деле у меня нет никаких мнений о том, какими должны быть значения time-to-live или time-to-idle, поэтому я оставляю их неустановленными.
После нескольких дней просмотра я не думаю, что это работает так, как я ожидал. Например, я провел тест с максимальным количеством элементов L2, равным 4. Я заполнил его четырьмя элементами. Потом пошел ставить пятый элемент. Cache.put() возвратил результат без исключений, но Cache.get() сразу после этого с тем же ключом вернул null!
Итак, мой вопрос: как мне заставить EHCache+Terracotta делать то, что я хочу, или хотя бы что-то близкое?