Кэширование с помощью Guava

Какие классы Guava подходят для кэширования с потоком? Я использую скомпонованный ключ, который создается на лету, поэтому softKeys() не имеет смысла, не так ли? Я видел где-то ConcurentLinkedHashMap, это путь? Это уже в недавнем выпуске? Извините за хаотичный способ спросить...

Update

Этот вопрос довольно старый, и, глядя через него, ответы могут быть пустой тратой времени. Поскольку долгое время существует CacheBuilder, это путь.

Ответ 1

Похоже, что вы хотите MapMaker.makeComputingMap, но вы указываете softKeys, поэтому я предполагаю, что вы уже знакомы с этим классом.

Вы правы в отношении softKeys - это не сработает, если вы будете составлять клавиши "на лету", потому что softKeys заставляет карту использовать == вместо equals для сравнения ключей. Но вы должны быть в порядке с softValues и expiration, если нет побочного эффекта от воссоздания выведенной записи.

Ответ 2

Новая библиотека Guava с версией 10.0 представляет интерфейс Cache, который специально разработан для кэширования.

Он поставляется с CacheBuilder, который похож на MapMaker, и все методы кэширования MapMaker будут удалены в версии 11.

Пример из документации:

Cache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .concurrencyLevel(4)
   .weakKeys()
   .maximumSize(10000)
   .expireAfterWrite(10, TimeUnit.MINUTES)
   .build(
       new CacheLoader<Key, Graph>() {
         public Graph load(Key key) throws AnyException {
           return createExpensiveGraph(key);
         }
       });

Ответ 3

MapMaker.maximumSize() является долгосрочной заменой для ConcurrentLinkedHashMap. CLHM остается тестовым слоем для улучшения алгоритмов для последующего переноса, если есть согласие сообщества. Я ожидаю, что v2.0 станет последней версией после переноса этих улучшений на MapMaker. Проект будет оставаться живым по мере необходимости, поскольку он имеет хорошую базу пользователей (например, Apache Cassandra). Я очень доволен, что Гува включил его.