【问题标题】:Caching with Guava使用番石榴进行缓存
【发布时间】:2011-01-19 10:13:19
【问题描述】:

哪些 Guava 类适合线程安全缓存?我使用了一个组合键,它是动态构建的,所以 softKeys() 没有意义,对吧?我在某处看到了 ConcurentLinkedHashMap,这是要走的路吗?它已经在最近的版本中了吗?抱歉问的方式很混乱……

更新

这个问题已经很老了,浏览他的答案可能会浪费时间。很久以来就有一个CacheBuilder 这是要走的路。

【问题讨论】:

    标签: java caching guava


    【解决方案1】:

    10.0 版的新 Guava 库引入了专为缓存而设计的Cache 接口。

    自带CacheBuilder,与MapMaker类似,MapMaker的所有缓存方法将在release 11中移除。

    文档中的示例:

    Cache<Key, Graph> graphs = CacheBuilder.newBuilder()
       .concurrencyLevel(4)
       .weakKeys()
       .maximumSize(10000)
       .expireAfterWrite(10, TimeUnit.MINUTES)
       .build(
           new CacheLoader<Key, Graph>() {
             public Graph load(Key key) throws AnyException {
               return createExpensiveGraph(key);
             }
           });
    

    【讨论】:

      【解决方案2】:

      听起来你想要@987654321@,但你提到softKeys,所以我假设你已经熟悉那个类。

      softKeys 是正确的 - 如果您即时组合键,它将不起作用,因为 softKeys 导致映射使用 == 而不是 equals 进行键比较。但是你应该可以使用softValuesexpiration,只要重新创建一个被驱逐的条目没有副作用。

      【讨论】:

      • 这是可能的,但到期除外。我的
      • 重新创建没有副作用,这些值实际上永不过期。我没有考虑过softValues,这是个好主意。它实际上可以防止耗尽所有内存(某种程度上,SoftReference 清理在当前的 Java 中是一个错误)。 PS:抱歉之前的评论不完整,我太慢了。
      • 在本周即将发布的 Guava 版本 8 中,请注意 expire() 已分为两种形式:expireAfterWrite() 和 expireAfterAccess()。还有一个 maximumSize() 选项。
      • 我知道拆分过期,但我不知道maximumSize()。这就是我需要的,我想。谢谢。
      • @Kevin 本周来!耶!
      【解决方案3】:

      MapMaker.maximumSize()ConcurrentLinkedHashMap 的长期替代品。如果社区达成共识,CLHM 仍然是改进算法的试验台,以便以后移植。不过,我预计 v2.0 将是在将这些改进移植到 MapMaker 之后的最后一个版本。该项目将根据需要保持活跃,因为它拥有良好的用户群(例如 Apache Cassandra)。我很高兴 Guava 包含了它。

      【讨论】:

      • MapMaker.maximumSize() 已弃用并计划在版本 11 中删除
      • 是的,我们将其替换为 CacheBuilder,它是 MapMaker 的一个分支,用于容纳更多以缓存为中心的设计和 api。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多