使用 CacheBuilder 的缓存作为地图



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

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

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

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

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

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

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

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

使用番石榴的另一个实用程序 - MapMaker。从文档中:

ConcurrentMap 实例的构建器,具有 以下特点:

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

(...

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

最新更新