Знает ли кто-нибудь из вас о карте Java или аналогичном стандартном хранилище данных, которое автоматически удаляет записи после заданного времени ожидания? Это означает старение, когда старые просроченные записи автоматически «устаревают».
Желательно в библиотеке с открытым исходным кодом, которая доступна через Maven?
Я сам знаю способы реализации функциональности и делал это несколько раз в прошлом, так что я не прошу совета в этом отношении, но обращаюсь к указателям на хорошую справочную реализацию.
Решения на основе WeakReference, такие как WeakHashMap , не подходят, потому что мои ключи, скорее всего, не являются интернированными строками, и я хочу настраиваемое время ожидания, которое не зависит от сборщика мусора.
Ehcache также вариант, на который я не хотел бы полагаться, потому что ему нужны внешние файлы конфигурации. Я ищу решение только для кода.
источник
Ответы:
Да. В Google Collections, или Guava, как его теперь называют, есть что-то под названием MapMaker, которое может сделать именно это.
Обновить:
Начиная с версии 10.0 (выпущена 28 сентября 2011 г.), многие из этих методов MapMaker устарели в пользу нового CacheBuilder :
источник
weakKeys()
подразумевает, что ключи сравниваются с использованием семантики ==, а неequals()
. Я потерял 30 минут, чтобы выяснить, почему мой кеш со строковым ключом не работал :)weakKeys()
, важна.weakKeys()
не требуется 90% времени.Это пример реализации, который я сделал для того же требования, и параллелизм работает хорошо. Может быть полезно для кого-то.
Git Repo Link (с реализацией слушателя)
https://github.com/vivekjustthink/WeakConcurrentHashMap
Ура !!
источник
cleanMap()
половину указанного времени?Вы можете попробовать мою реализацию самодействующей хэш-карты. Эта реализация не использует потоки для удаления записей с истекшим сроком, вместо этого она использует DelayQueue, который очищается при каждой операции автоматически.
источник
В Apache Commons есть декоратор для Map, срок действия которого истекает: PassiveExpiringMap Это проще, чем кеши из Guava.
PS будьте осторожны, это не синхронизировано.
источник
Похоже, что ehcache является излишним для того, что вы хотите, однако обратите внимание, что ему не нужны внешние файлы конфигурации.
Как правило, рекомендуется перенести конфигурацию в декларативные файлы конфигурации (поэтому вам не нужно перекомпилировать, когда для новой установки требуется другое время истечения), но это совсем не требуется, вы все равно можете настроить ее программно. http://www.ehcache.org/documentation/user-guide/configuration
источник
В коллекциях Google (гуава) есть MapMaker, в котором вы можете установить ограничение по времени (для истечения срока действия), и вы можете использовать мягкую или слабую ссылку по своему усмотрению, используя фабричный метод для создания экземпляров по вашему выбору.
источник
Вы можете попробовать Expiring Map http://www.java2s.com/Code/Java/Collections-Data-Structure/ExpiringMap.htm класс из проекта Apache MINA
источник
Если кому-то нужна простая вещь, ниже приведен простой набор ключей, срок действия которых истекает. Это может быть легко преобразовано в карту.
источник
System.nanoTime()
для вычисления разницы во времени, поскольку System.currentTimeMillis () не согласован, так как он зависит от системного времени и может быть не непрерывным.Как правило, кэш должен хранить объекты в течение некоторого времени и раскрывать их через некоторое время. Какое хорошее время держать объект, зависит от варианта использования. Я хотел, чтобы эта вещь была простой, без потоков или планировщиков. Этот подход работает для меня. В отличие от
SoftReference
s, объекты гарантированно будут доступны какое-то минимальное количество времени. Однако они не остаются в памяти, пока солнце не превратится в красного гиганта .В качестве примера использования рассмотрим медленно реагирующую систему, которая должна быть в состоянии проверить, был ли выполнен запрос совсем недавно, и в этом случае не выполнять запрошенное действие дважды, даже если активный пользователь нажимает кнопку несколько раз. Но, если то же действие запрашивается через некоторое время, оно должно быть выполнено снова.
источник
Кеш Guava прост в реализации. Мы можем просрочить ключ на временной основе, используя кеш Guava. Я прочитал полностью пост и ниже дает ключ моего исследования.
Ссылка: пример кэша гуавы
источник