我正在使用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");
来自番石榴缓存文档: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()
视图来修改缓存。
除了@rdas答案,情侣笔记:
LoadingCache
(如你的例子),两者之间真的没有区别(好吧,使用.asMap()
更混乱),有时你想/必须使用(Concurrent)Map
接口兼容,在这种情况下使用.asMap()
是非常好。Cache
接口不提供这样的方法,但Map
确实如此 - 请参阅my other answer on "How to get all values from Guava LoadingCache
without passing any keys"。Cache
启用了.asMap()
,那么修改CacheStats
的CacheBuilder#recordStats()
视图不会更新qazxswpoi。