一尘不染

具有过期密钥的基于Java时间的地图/缓存

java

你是否知道在给定超时后会自动清除条目的Java Map或类似标准数据存储?这意味着老化,旧的过期条目会自动“老化”。

最好在可通过Maven访问的开源库中?

我知道自己实现该功能的方法,并且过去已经做过几次,所以我并不是在这方面寻求建议,而是寻求指向一个好的参考实现的指针。

像WeakHashMap这样的基于WeakReference的解决方案不是一个选择,因为我的密钥很可能是非interintern字符串,并且我希望可配置的超时时间不依赖于垃圾回收器。

我也不想依靠Ehcache,因为它需要外部配置文件。我正在寻找仅代码解决方案。


阅读 423

收藏
2020-03-11

共1个答案

一尘不染

是。Google Collections或Guava的名称现在有了一个叫做MapMaker的东西,可以做到这一点。

ConcurrentMap<Key, Graph> graphs = new MapMaker()
   .concurrencyLevel(4)
   .softKeys()
   .weakValues()
   .maximumSize(10000)
   .expiration(10, TimeUnit.MINUTES)
   .makeComputingMap(
       new Function<Key, Graph>() {
         public Graph apply(Key key) {
           return createExpensiveGraph(key);
         }
       });

更新:

从guava 10.0(2011年9月28日发布)开始,许多MapMaker方法已被弃用,以支持新的CacheBuilder:

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
    .maximumSize(10000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(
        new CacheLoader<Key, Graph>() {
          public Graph load(Key key) throws AnyException {
            return createExpensiveGraph(key);
          }
        });
2020-03-11