4

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

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

通常,Guava 缓存实用程序适用于以下情况:

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

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

4

1 回答 1

3

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

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

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

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

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

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

(...)

返回的映射实现为具有与 ConcurrentHashMap 类似的性能特征的哈希表。它支持 ConcurrentMap 接口的所有可选操作。它不允许空键或值。

于 2012-06-21T18:53:50.023 回答