【问题标题】:Use CacheBuilder's cache as a Map使用 CacheBuilder 的缓存作为 Map
【发布时间】:2012-06-21 17:28:09
【问题描述】:

我目前在我的应用程序中使用ConcurrentHashMap,但我需要添加在超时期限后有效地使条目过期的功能(expireAfterWrite),并在删除条目时通知删除侦听器。

我看到CacheBuilder 可以提供我需要的东西,但我犹豫要不要使用它,因为我需要的是地图,而不是缓存。我这么说(地图和缓存之间的区别)是因为番石榴缓存文档这么说

一般来说,Guava 缓存实用程序适用于:

  • 您愿意花费一些内存来提高速度。
  • 您希望键有时会被多次查询。
  • 原则上,如果每个值都立即从缓存中逐出,您的应用程序将正常工作 - 但您正试图减少 重复工作。

特别是第三个要点在我的应用程序中不合适。我将值存储在我想稍后检索的地图/缓存中(直到它到期)。此外,我的密钥通常只被查询一两次,而不是很多次才能看到缓存的好处。所以你看我的要求是地图,而不是某种意义上的缓存。使用 CacheBuilder 作为映射来存储将 expireAfterWrite 并提供removingListener 功能的值仍然是一个好主意吗?有人对 CacheBuilder 实现的内部知识足够了解以提供建议吗?

【问题讨论】:

  • 我刚刚从 wiki 文章中删除了违规行;我原来写的。是的,这是CacheBuilder 的有效申请。

标签: java guava


【解决方案1】:

编辑: 当然MapMaker 缓存功能已被CacheBuilder 弃用,我的错。不要犹豫使用它:

Cache<Key, Graph> graphs = CacheBuilder.newBuilder()
    .concurrencyLevel(4) // read docs for more details
    .expireAfterWrite(yourExpireTime, TimeUnit.MINUTES)
    .build();

如果您希望将其视为 ConcurrentMap,请使用 Cache#asMap()

使用 Guava 的另一个实用程序 - MapMaker。来自文档:

具有任意组合的 ConcurrentMap 实例的构建器 以下特点:

  • 键或值自动包装在弱引用或软引用中
  • 超过最大大小时最近最少使用的驱逐
  • 基于时间的条目过期,自上次访问或上次写入后测量
  • 被驱逐(或以其他方式删除)条目的通知
  • 按需计算尚未存在的键的值

(...)

返回的地图被实现为一个类似的哈希表 ConcurrentHashMap 的性能特征。它支持所有 ConcurrentMap 接口的可选操作。它不允许 null 键或值。

【讨论】:

  • ...嗯? CacheBuilder 绝对推荐用于此用途。
  • @LouisWasserman +1。我没有在 MapMaker 方法(过期)中看到 @Deprecated 注释......而且它的文档(在类级别)具有误导性,根本没有提到 Cache 并使用旧方法名称。我应该填写问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2011-11-08
  • 1970-01-01
  • 2018-04-24
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多