【问题标题】:What is a "LoadingCache"?什么是“加载缓存”?
【发布时间】:2017-05-16 06:14:32
【问题描述】:

Google 提供“loading cache”,描述如下:

从键到值的半持久映射。值由缓存自动加载,并存储在缓存中,直到被驱逐或手动失效。

很遗憾,上面的描述不是很清楚。 “自动加载”是什么意思?

我希望它的意思是:“如果请求的密钥在缓存中不存在,则它会自动添加到其中”。

这个语句在一定程度上支持了这一点(来自 get() 函数):

"返回在这个缓存中关联的值,首先加载那个 必要时取值。”

但同样,缓存的“加载”方面是用“加载”一词来解释的。走的路,谷歌:[

【问题讨论】:

  • 它做你认为它做的事。但我想知道为什么这个问题存在。你为什么不先尝试呢?鉴于您可以在 Guava 的 GitHub 项目或 Internet 上找到大量示例,因此设置并不复杂。你会亲眼看到它正在做你认为它正在做的事情。请注意,Wikipedia 上明确使用了“负载”一词,Guava documentation(不是 Javadoc,真正的文档)解释了这是进一步的细节。
  • LoadingCache 的第二个谷歌搜索结果链接到 Guava wiki page "CachesExplained" - 如果您仍然不明白它的目的,请阅读并提出任何进一步的具体问题。
  • @OlivierGrégoire:我不是 Java 程序员。尝试这个对我来说并非易事。另外,wiki 文章也不错,但是其中两次提到了 load 这个词,我可以很容易地在类似的上下文中找到“put”这个词(参见:developer.mozilla.org/en-US/docs/Web/API/Cache/put)。
  • @Xaerxess:感谢您的链接。我发帖之前确实看到了。它也没有解释加载是什么,只是说:“LoadingCache 可能很有用 [..],因为它的自动缓存加载”。这(再次)什么也没解释。

标签: caching guava


【解决方案1】:

Guava 的 wiki 文档中有一个 full definition:(重点是我的)

LoadingCache 是一个 Cache,带有附加的 CacheLoader。创建CacheLoader 通常与实现方法V load(K key) throws Exception 一样简单。因此,例如,您可以使用以下代码创建 LoadingCache

[...]

查询LoadingCache 的规范方法是使用方法get(K)这将返回一个已经缓存的值,或者使用缓存的CacheLoader 将新值自动加载到缓存中。因为CacheLoader 可能会抛出ExceptionLoadingCache.get(K) 会抛出@ 987654335@。如果您定义了一个未声明任何已检查异常的CacheLoader,那么您可以使用getUnchecked(K) 执行缓存查找;但是必须注意不要在 CacheLoaders 声明检查异常的缓存上调用 getUnchecked

强调的句子解释了所有需要解释的内容:一个值要么从缓存中获取,要么在调用get(K) 时加载。


在您所说的 cmets 中,您希望更加强调正在加载。当将东西放入缓存中时,你放入。当您不将内容放入缓存中,但缓存会自行计算并放入时,缓存会为您加载

【讨论】:

  • 感谢您确认我的问题!我仍然认为用“它将以原子方式 X”来解释“X 缓存”并不是非常具有描述性的,并且留下了怀疑的余地(因此也是这个问题)。
  • 关于“原子”,请参考 Java 的 "atomic" definition:这是将“作为单个操作”执行的代码,这在多线程应用程序中很重要。
  • 谢谢。也许我应该更清楚一点:重点不在于原子性。它关于“加载”位。但现在很清楚了。
  • 将东西放入缓存中时,你放入。当您不将内容放入缓存中,但缓存会自行计算并放入时,缓存会为您加载
  • 正是文档中缺少的定义。谢谢!
猜你喜欢
  • 2010-10-07
  • 2010-09-18
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2020-05-16
相关资源
最近更新 更多