Cache.asMap (). Put () или Cache.put () - PullRequest
0 голосов
/ 30 апреля 2019

Я использую Google-guava-кеш.Определяется как:

Cache<String, String> myCache= CacheBuilder.newBuilder().maximumSize(100).build();  

Когда я выполняю операцию карты, такую ​​как get / put, используя:

  myCache.asMap().put("someString", "someString");
  String someValueFromCache = myCache.asMap().get("someString");

Я хочу знать, будет ли какая-либо оптимизация или какая-либо разница, еслиЯ использую его в соответствии со следующим образом, т.е. без использования в качестве карты:

  myCache.put("someString", "someString");
  String someValueFromCache = myCache.get("someString");

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Из документов кэша гуавы: https://github.com/google/guava/wiki/CachesExplained#inserted-directly

Значения могут быть вставлены в кэш напрямую с помощью cache.put (ключ, значение).Это перезаписывает любую предыдущую запись в кеше для указанного ключа.Изменения также могут быть внесены в кэш с использованием любого из методов ConcurrentMap, предоставляемых представлением Cache.asMap ().Обратите внимание, что никакой метод в представлении asMap никогда не приведет к автоматической загрузке записей в кэш.Кроме того, атомарные операции в этом представлении работают вне области автоматической загрузки кэша, поэтому Cache.get (K, Callable) всегда следует отдавать предпочтение над Cache.asMap (). PutIfAbsent в кешах, которые загружают значения с использованием CacheLoader или Callable.

Не думайте, что вы должны использовать представление asMap() для изменения кэша.

1 голос
/ 30 апреля 2019

В дополнение к ответу @rdas, пара замечаний:

  1. Если вы не используете LoadingCache (как в вашем примере), между ними нет никакой разницы (ну, используя .asMap() более загроможден), и иногда вы хотите / должны использовать (Concurrent)Map интерфейс для совместимости, в этом случае использование .asMap() совершенно нормально.
  2. Если вы хотите получить доступ / перебирать все ключи /значения, интерфейс Cache не предлагает такие методы, но Map делает - см. мой другой ответ на вопрос «Как получить все значения из Гуавы LoadingCache без передачи ключей» .
  3. Есть и другое отличие (на самом деле, в документации, но я усвоил это нелегко): изменение Cache его представлением .asMap() не обновляет CacheStats, если у вас естьони включаются через CacheBuilder#recordStats().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...