Cache.asMap()。put()或Cache.put()

问题描述 投票:0回答:2

我正在使用Google-guava-cache。将其定义为:

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");
java caching guava
2个回答
2
投票

来自番石榴缓存文档:https://github.com/google/guava/wiki/CachesExplained#inserted-directly

可以使用cache.put(key,value)直接将值插入到缓存中。这将覆盖指定键的缓存中的任何先前条目。还可以使用Cache.asMap()视图公开的任何ConcurrentMap方法对缓存进行更改。请注意,asMap视图上的任何方法都不会导致条目自动加载到缓存中。此外,该视图上的原子操作在自动缓存加载的范围之外运行,因此Cache.get(K,Callable)应始终优先于Cache.asMap()。putIfAbsent在使用CacheLoader或Callable加载值的缓存中。

不要以为你应该使用asMap()视图来修改缓存。


1
投票

除了@rdas答案,情侣笔记:

  1. 如果你不使用LoadingCache(如你的例子),两者之间真的没有区别(好吧,使用.asMap()更混乱),有时你想/必须使用(Concurrent)Map接口兼容,在这种情况下使用.asMap()是非常好。
  2. 如果你想访问/遍历所有键/值,Cache接口不提供这样的方法,但Map确实如此 - 请参阅my other answer on "How to get all values from Guava LoadingCache without passing any keys"
  3. 还有其他的区别(实际上是在文档中,但我学到了很难):如果你通过Cache启用了.asMap(),那么修改CacheStatsCacheBuilder#recordStats()视图不会更新qazxswpoi。
© www.soinside.com 2019 - 2024. All rights reserved.