Может кто-нибудь помочь мне понять Guava CacheLoader?
Я новичок в библиотеке Google Guava и интересуюсь пакетом Guava Caching. В настоящее время я загружаю версию 10.0.1. Просмотрев документацию, JUnit тестирует исходный код и даже после долгого поиска google, я все еще не могу понять, как использовать пакет Caching. Документация очень короткая, как если бы она была написана для тех, кто использовал библиотеку Guava не для новичков вроде меня. Я просто хочу, чтобы были примеры реальных реальностей о том, как правильно использовать кеширующий пакет.
Предположим, что я хочу создать кеш из 10 неисчерпаемых предметов с методом вытеснения с наименьшим использованием (LRU). Итак, из примера, найденного в api, я создаю свой код следующим образом:
Cache<String, String> mycache = CacheBuilder.newBuilder()
.maximumSize(10)
.build(
new CacheLoader<String, String>() {
public String load(String key) throws Exception {
return something; // ?????
}
});
Поскольку CacheLoader требуется, я должен включить его в метод сборки CacheBuilder. Но я не знаю, как вернуть правильное значение из mycache.
Чтобы добавить элемент в mycache, я использую следующий код:
mycache.asMap().put("key123", "value123");
Чтобы получить элемент из mycache, я использую этот метод:
mycache.get("key123")
Метод get всегда будет возвращать возвращаемое мной значение из метода загрузки CacheLoader вместо получения значения из mycache. Может кто-нибудь любезно рассказать мне, что я пропустил?
Ответы
Ответ 1
Тип Guava Cache
обычно предназначен для использования в качестве кэша вычислений. Обычно вы не добавляете к нему значения вручную. Скорее вы расскажете, как загрузить дорогостоящее значение вычисления для ключа, указав ему CacheLoader
, который содержит необходимый код.
Типичным примером является загрузка значения из базы данных или дорогостоящий расчет.
private final FooDatabase fooDatabase = ...;
private final LoadingCache<Long, Foo> cache = CacheBuilder.newBuilder()
.maximumSize(10)
.build(new CacheLoader<Long, Foo>() {
public Foo load(Long id) {
return fooDatabase.getFoo(id);
}
});
public Foo getFoo(long id) {
// never need to manually put a Foo in... will be loaded from DB if needed
return cache.getUnchecked(id);
}
Кроме того, я попробовал приведенный вами пример и mycache.get("key123")
вернулся "value123"
, как и ожидалось.