猿问

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

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


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


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


基于WeakReference的解决方案(如WeakHashMap)不是一个选项,因为我的键很可能是非实习字符串,我想要一个不依赖于垃圾收集器的可配置超时。


Ehcache也是一个我不想依赖的选项,因为它需要外部配置文件。我正在寻找一个仅限代码的解决方案。


慕的地8271018
浏览 630回答 3
3回答

烙印99

是。谷歌集合,或现在命名的番石榴有一个名为MapMaker的东西可以做到这一点。ConcurrentMap<Key, Graph> graphs = new MapMaker()&nbsp; &nbsp;.concurrencyLevel(4)&nbsp; &nbsp;.softKeys()&nbsp; &nbsp;.weakValues()&nbsp; &nbsp;.maximumSize(10000)&nbsp; &nbsp;.expiration(10, TimeUnit.MINUTES)&nbsp; &nbsp;.makeComputingMap(&nbsp; &nbsp; &nbsp; &nbsp;new Function<Key, Graph>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;public Graph apply(Key key) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return createExpensiveGraph(key);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;});更新:从guava 10.0(2011年9月28日发布)开始,许多这些MapMaker方法已被弃用,以支持新的CacheBuilder:LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()&nbsp; &nbsp; .maximumSize(10000)&nbsp; &nbsp; .expireAfterWrite(10, TimeUnit.MINUTES)&nbsp; &nbsp; .build(&nbsp; &nbsp; &nbsp; &nbsp; new CacheLoader<Key, Graph>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public Graph load(Key key) throws AnyException {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return createExpensiveGraph(key);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });

明月笑刀无情

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

相关分类

Java
我要回答