#java #caching
#java #кэширование
Вопрос:
Я ищу Java-библиотеку, которая действует как cache
с отслеживанием использования для кэширования объектов с ключами, создание которых дорого, их необходимо закрывать при удалении, и они могут быть разделены между потоками.
Я определил следующие требования:
Кэш-Свойства:
- удаление на основе размера (настраиваемый максимальный размер)
- элементы, которые используются наименее недавно, должны быть рассмотрены для удаления в первую очередь
- очистка при удалении (закрытие ресурсов удаляемого элемента)
- доступ, подобный карте (ключ-значение)
- элементы должны храниться как можно дольше, поскольку их создание дорого (поэтому слабые ссылки, такие как в
guava
илиcaffeine
, не подходят)
Использование-Отслеживание-Свойства:
- элементы могут быть помечены как «используемые»
- элементы, которые «используются», не удаляются, и поиск нового элемента может блокироваться, когда кэш заполнен и в настоящее время ничего нельзя удалить
- «Usage-Tracking-Properties» также может быть заменен возможностью избежать удаления на основе некоторого свойства времени выполнения элемента, который кэш хочет удалить
Общая информация:
- предпочтительнее была бы облегченная библиотека
Что я нашел до сих пор:
ehcache
есть возможность настроить anEvictionAdvisor
, который звучал многообещающе, но, к сожалению, он «может быть вызван только тогда, когда сопоставление записывается в кеш», поэтому «ожидается, что он будет постоянным для пары ключ-значение». Возможно, есть возможность перезаписывать сопоставление каждый раз, когда изменяется статус использования, но это звучит не оптимально…
Комментарии:
1. Возможно, добавьте немного того, что на самом деле делает ваше приложение, чтобы избежать проблемы XY. Вопросы: Как долго элемент будет «использоваться»? Сколько элементов кэшируется и сколько будет использоваться одновременно?
2. В EHCache есть функция «закрепления», я думаю, это то, что вы ищете. В будущем я хотел бы добавить что-то подобное в cache2k .
3. @cruftex большое спасибо за ваш вклад! ресурсы представляют собой индексы поиска с разделением на недели, а фактическое время использования находится в диапазоне миллисекунд (когда документы записываются, индекс запрашивается или удаляется), и могут быть индексы, которые используются с высокой частотой (особенно для записи, когда это индекс текущей недели). В настоящее время я использую решение, включающее guava-cache для хранения всего и удаления и ConcurrentHashMap для используемых в настоящее время ресурсов — оно работает, но далеко не оптимально, поскольку требует большой синхронизации. Я посмотрю на закрепление.
4. Я сомневаюсь, что EHCache будет быстрее, чем то, что у вас есть в настоящее время.