Подтвердить что ты не робот

Может кто-нибудь помочь мне понять 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. Может кто-нибудь любезно рассказать мне, что я пропустил?

4b9b3361

Ответ 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", как и ожидалось.