为了账号安全,请及时绑定邮箱和手机立即绑定

带有过期密钥的Java基于时间的映射/缓存

带有过期密钥的Java基于时间的映射/缓存

慕的地8271018 2019-08-30 11:11:33
你们是否知道Java Map或类似的标准数据存储在给定的超时后自动清除条目?这意味着老化,旧的过期条目会自动“老化”。最好是在可通过Maven访问的开源库中?我知道自己实现这些功能的方法,并且过去曾多次这样做过,所以我不是在这方面寻求建议,而是指向一个好的参考实现。基于WeakReference的解决方案(如WeakHashMap)不是一个选项,因为我的键很可能是非实习字符串,我想要一个不依赖于垃圾收集器的可配置超时。Ehcache也是一个我不想依赖的选项,因为它需要外部配置文件。我正在寻找一个仅限代码的解决方案。
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

是。谷歌集合,或现在命名的番石榴有一个名为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);

          }

        });


查看完整回答
反对 回复 2019-08-30
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您可以尝试我自我实现的哈希映射的实现。此实现不使用线程来删除过期的条目,而是使用在每次操作时自动清理的DelayQueue。


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 629 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号