5

我正在尝试创建一个地图,其中条目超时并在一段时间后被删除。

基本上,<K, V> Map.put(K key, V value, long **time**)- 条目将立即放入地图中,并在时间(毫秒)后过期。我不需要在将来的任何时候恢复已删除的条目,但我想确保它不再在地图中。

例如:map.put("foo", "bar", 60l * 1000l)将让这个键值对在地图中存在一分钟(60long 和 1000long)。

尝试:使用 ConcurentMap 并Map.put(K key, V value, long **time**)通过以下方式实现:
1. 调用super.put(key, value)
2. 创建一个休眠时间(毫秒)的线程
3. 调用remove(key)以删除条目。

问题:请评论/让我知道这在线程安全、一致性或我尝试中的任何缺陷方面是否是一个好主意。如果您认为有更好的方法来实现这一点,请提供任何建议。

编辑:感谢您的回复,内存不是这里的问题,我真的只关心条目的短暂生命周期。谢谢你。

4

3 回答 3

4

时间是你要解决的问题的重要组成部分吗?或者它是一个实现细节?如果您要解决的问题是内存使用问题,那么您会想到另外两种可能性:

  • LRU 地图。网上有很多这样的。
  • 由 WeakReference 或 SoftReference 对象支持的 Map,允许 GC 收集这些项目。

编辑

在这种情况下,有一些现有的实现可能会为您节省一些时间。例如:

于 2010-12-28T17:34:10.013 回答
1

如果您因为某些内存问题(地图是临时缓存)而这样做,您可能应该考虑使用软引用(文档)。

于 2010-12-28T17:34:15.593 回答
1

看看Guava - 它是来自 Google 的集合库。特别是,您想查看 CacheBuilder 及其计算图。它的一个功能是“基于时间的条目过期,自上次访问或上次写入以来测量”,听起来正是您正在寻找的。

(编辑谈论CacheBuilder;自从我发布此内容以来它是新的,并且与问题更相关)

于 2011-08-02T01:01:56.157 回答