Кэширование с помощью 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). Я очень доволен, что Гува включил его.