Может кто-нибудь помочь мне понять Guava CacheLoader? - PullRequest
28 голосов
/ 16 октября 2011

Я новичок в библиотеке Google Guava и интересуюсь пакетом кэширования Guava.В настоящее время у меня загружена версия 10.0.1.Изучив документацию, JUnit тестирует исходный код и даже после тщательного поиска в Google, я все еще не могу понять, как использовать пакет Caching.Документация очень короткая, как если бы она была написана для кого-то, кто использовал библиотеку Гуавы, а не для такого новичка, как я.Я просто хотел бы, чтобы было больше примеров из реальной жизни о том, как правильно использовать пакет Caching.

Допустим, я хочу создать кэш из 10 не истекающих элементов с помощью метода выселения Least недавно использовавшихся (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 Ответ

38 голосов
/ 16 октября 2011

Тип 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", как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...