【问题标题】:How to efficiently store objects in a LoadingCache, that may have more than one key如何有效地将对象存储在可能具有多个键的 LoadingCache 中
【发布时间】:2014-08-10 11:37:58
【问题描述】:

我有一个数据结构,其中有对象,它们有目标。他们有一个多对多的关系。 例如:object1 有目标:t1、t2、t3 和 object2 有目标:t2, t3。

我想编写一个 Guava LoadingCache 以便按目标存储这些对象中的每一个。现在,问题在于:对象 1 和 2 都将存储在 t2 和 t3 下。这是浪费。

所以,我想到的一个解决方案是拥有另一张 id 地图。而在目标缓存中,我将通过对象的 id 来存储对象。

现在,问题是:由于在 LoadingCache 中我们没有公开处理清除缓存的方法(或者在缓存被清除时监听的方法。),我无法保持 id 映射日期,缓存实际更新的时间。

有没有让这两张地图保持同步的好方法?

【问题讨论】:

  • 我想我对您想要实现的目标有一个大致的了解,但是,最好以简化代码为例。我目前的具体问题是:什么需要保持同步?只是价值变化还是目标关联?也许对原始问题场景的描述也能很好地避免 XY 问题。

标签: java caching guava


【解决方案1】:

我质疑你的前提,特别是“这是浪费”。您正在存储对对象的多个引用,而不是对象本身的多个副本,并且引用很便宜。拥有另一张 id 地图可能比最初的原始方法更昂贵

【讨论】:

  • Louis,我认为这个假设是不正确的,因为加载缓存会为每个目标构造一个新实例。然而,加载器可以依次查询缓存是否存在“别名”目标上的映射......
  • @cruftex,并不是说缓存必须为每个目标构造一个新实例,只有 OP 可以告诉我们是哪种情况。对我来说,听起来缓存可能没有为每个目标构建一个新实例。
  • 所以缓存看起来像这样 >,据我所知,immutablelist 会创建一个新副本。所以它实际上确实复制了对象。还是我在这里遗漏了什么?
  • 什么? ImmutableList 不会复制添加到其中的对象。 Java 中无法普遍复制对象。
  • @SThomas,事实并非如此。 ImmutableList 确实通过引用存储,如果它们是可变类型,您可以更改其元素。您似乎误解了某些东西,或者您的程序不正确。参见例如stackoverflow.com/q/2185789/869736 进行一些解释。
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 2020-03-24
  • 2015-07-08
  • 2018-12-10
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2014-01-18
相关资源
最近更新 更多