将CacheBuilder的缓存用作Map

时间:2012-06-21 17:28:09

标签: java guava

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

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

  

通常,Guava缓存实用程序适用于:

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

具体来说,我的应用程序中的thrid项目符号不合适。我将值存储在我想要稍后检索的地图/缓存中(直到其到期)。此外,我的密钥通常只被查询一到两次,而不是很多次查看缓存的好处。所以你看到我的要求是地图,而不是某种意义上的缓存。使用CacheBuilder作为映射来存储expireAfterWrite并提供removeListener功能的值仍然是一个好主意吗?有谁知道CacheBuilder实现的内部提供建议?

1 个答案:

答案 0 :(得分:3)

编辑:当然{@ 1}}缓存功能已被弃用,而不是CacheBuilder,我的不好。不要犹豫使用它:

MapMaker

然后使用Cache#asMap(),如果您希望它的视图为ConcurrentMap。

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

  

ConcurrentMap实例的构建器,具有任意组合   以下功能:

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

(...)

     

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