В поисках облегченного кэша Java с отслеживанием использования для закрываемых элементов

#java #caching

#java #кэширование

Вопрос:

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

Я определил следующие требования:

Кэш-Свойства:

  • удаление на основе размера (настраиваемый максимальный размер)
  • элементы, которые используются наименее недавно, должны быть рассмотрены для удаления в первую очередь
  • очистка при удалении (закрытие ресурсов удаляемого элемента)
  • доступ, подобный карте (ключ-значение)
  • элементы должны храниться как можно дольше, поскольку их создание дорого (поэтому слабые ссылки, такие как в guava или caffeine , не подходят)

Использование-Отслеживание-Свойства:

  • элементы могут быть помечены как «используемые»
  • элементы, которые «используются», не удаляются, и поиск нового элемента может блокироваться, когда кэш заполнен и в настоящее время ничего нельзя удалить
  • «Usage-Tracking-Properties» также может быть заменен возможностью избежать удаления на основе некоторого свойства времени выполнения элемента, который кэш хочет удалить

Общая информация:

  • предпочтительнее была бы облегченная библиотека

Что я нашел до сих пор:

  • ehcache есть возможность настроить an EvictionAdvisor , который звучал многообещающе, но, к сожалению, он «может быть вызван только тогда, когда сопоставление записывается в кеш», поэтому «ожидается, что он будет постоянным для пары ключ-значение». Возможно, есть возможность перезаписывать сопоставление каждый раз, когда изменяется статус использования, но это звучит не оптимально…

Комментарии:

1. Возможно, добавьте немного того, что на самом деле делает ваше приложение, чтобы избежать проблемы XY. Вопросы: Как долго элемент будет «использоваться»? Сколько элементов кэшируется и сколько будет использоваться одновременно?

2. В EHCache есть функция «закрепления», я думаю, это то, что вы ищете. В будущем я хотел бы добавить что-то подобное в cache2k .

3. @cruftex большое спасибо за ваш вклад! ресурсы представляют собой индексы поиска с разделением на недели, а фактическое время использования находится в диапазоне миллисекунд (когда документы записываются, индекс запрашивается или удаляется), и могут быть индексы, которые используются с высокой частотой (особенно для записи, когда это индекс текущей недели). В настоящее время я использую решение, включающее guava-cache для хранения всего и удаления и ConcurrentHashMap для используемых в настоящее время ресурсов — оно работает, но далеко не оптимально, поскольку требует большой синхронизации. Я посмотрю на закрепление.

4. Я сомневаюсь, что EHCache будет быстрее, чем то, что у вас есть в настоящее время.