我面临着与作者类似的问题: DelayQueue with higher speed remove()?
问题: 我需要连续处理传入的数据并检查数据是否在之前的某个时间段内被查看过。因此,我计算传入数据的唯一ID,并将ID索引的数据添加到地图中。同时,我将ID和超时时间戳存储在PriorityQueue中,使我能够有效地检查最新的ID以超时。不幸的是,如果数据在指定的超时之前再次进入,我需要更新存储在PriorityQueue中的超时。到目前为止,我刚刚删除了旧ID并重新添加了ID以及新的超时。如果我的PriorityQueue增长超过300k元素,那么除了耗时的删除方法之外,这很有效。
可能的解决方案: 我只是考虑使用DelayQueue,这样可以更容易地等待第一个数据超时,遗憾的是我还没有找到一种有效的方法来更新存储在这样的DelayQueue中的超时元素,而不会遇到与PriorityQueue:删除方法!
有关如何以高效的方式解决此问题的任何想法,即使对于庞大的队列?
答案 0 :(得分:1)
这实际上听起来很像Guava Cache
,它是一个并发的堆栈缓存,支持"在此条目的最新查找之后很久就会过期。"如果你可以使用第三方库,那么重用它可能是最简单的。
如果失败了,实现使用的方法看起来像这样:它有一个哈希表,因此可以通过键来有效地查找条目,但条目也在并发的自定义链表中 - 你可以&# 39;使用内置库执行此操作。链接列表按照"最近最少访问的顺序排列。"访问条目时,它将移动到链接列表的末尾。每隔一段时间,您就会查看列表的开头 - 所有最近访问过的条目都存在 - 并删除那些早于阈值的条目。