Java 具有自动过期元素的映射
我需要一个Java 具有自动过期元素的映射,java,collections,Java,Collections,我需要一个映射(或任何集合),它支持条目空闲时间并自动删除它们 我知道有guavaMapMaker,但它会在后续读/写操作中终止元素,而不是通过运行线程自动终止元素。此外,MapMaker的过期功能现在被移动到CacheBuilder。问题是,我不想要缓存——我想要过期的元素 有现成的吗?(自己实现并不困难,但最好重用一些东西)也许: 而不是。。。它有许多未解析的导入。如果没有其他内容,您可以提供一个只抛出异常的虚拟缓存加载程序,然后不调用缓存。get--只与asMap视图交互。这并不漂亮,但我
映射
(或任何集合),它支持条目空闲时间并自动删除它们
我知道有guavaMapMaker
,但它会在后续读/写操作中终止元素,而不是通过运行线程自动终止元素。此外,MapMaker
的过期功能现在被移动到CacheBuilder
。问题是,我不想要缓存——我想要过期的元素
有现成的吗?(自己实现并不困难,但最好重用一些东西)也许:而不是。。。它有许多未解析的导入。如果没有其他内容,您可以提供一个只抛出异常的虚拟
缓存加载程序,然后不调用缓存。get
--只与asMap
视图交互。这并不漂亮,但我们正在努力在11.0中更好地支持这个案例。如果你尝试这个,一定要吃番石榴10.0.1
是的,Cache.cleanUp
随时可以从您想要的线程调用。Apache Mina的ExpiringMap正是您想要的
我建议使用Hazelcast提供的地图。它还提供分布式功能,但您可能对它们不感兴趣。您只需配置过期策略(time to live seconds
和max idle seconds
)并使用Map
,就像Java的HashMap
将要过期一样
更多信息可在此处找到:您是否需要元素以某种方式及时明确“死亡”(例如通过调用某个方法)?如果您只需要丢弃过期的元素,那么在访问时检查元素的时间戳就足够了。您可以让正在运行的线程定期调用Cache.cleanup()来触发过期项的逐出。虽然不是即时的,但是一个正在运行的线程在内部有太多的限制(不兼容J2EE/GAE,有狗堆效应等)。@Ben Manes感谢您的建议。但是我不喜欢缓存接口。首先,它强制您指定值计算。我不需要那个。如果我返回null,它将抛出一个NPE。这是因为它总是调用getOrCompute,我只需要像一个简单的地图一样获取。然后,即使抓到了NPE,我也无法让它工作(也许是我的错),但它总是会使条目过期,即使它们被访问。这是公平的。对于加载程序返回null是否正常(例如缓存未命中)存在争议。由于放松约束比添加约束更容易,因此在删除@Beta状态之前可能会发生变化。您可以使用cache.asMap()来使用缓存的映射视图,其中get()将不计算并允许写入(在10.0.1中)。@Ben Manes是的,但这不会刷新访问权限,项目将过期。这是一个(旧的)演示教程,而不是提供的库,因此未解析的导入似乎是公平的。这是一种幼稚而普遍的做法。我更喜欢我们添加到Guava中的摊销方法,因为它避免了陈旧事件的堆积。我尝试过,但是asMap
视图交互不会刷新最后访问。仅链接的答案不是最好的答案。你能通过提供一个小的代码示例来扩展它吗。它可以根据创建或访问时间使条目过期。