gpt4 book ai didi

java - 查找从某个键到某个键的消息,同时能够删除陈旧的键

转载 作者:搜寻专家 更新时间:2023-11-01 02:55:15 24 4
gpt4 key购买 nike

我的问题

假设我想将我的消息保存在某种数据结构中以用于长轮询应用程序:

1. "dude"
2. "where"
3. "is"
4. "my"
5. "car"

从 index[4,5] 请求消息应该返回: “我的”,“汽车”

接下来让我们假设一段时间后我想清除旧消息,因为它们不再有用并且我想节省内存。假设 x 时间后,消息 [1-3] 变得陈旧。我假设每 x 秒删除一次是最有效的。接下来我的数据结构应该包含:

4. "my"
5. "car"

我的解决方案?

我正在考虑使用 concurrentskiplistsetconcurrentskiplist 映射。此外,我正在考虑从 newSingleThreadScheduledExecutor 中删除旧消息。我想知道您将如何实现(高效/线程安全)这个或者可能使用一个库?

最佳答案

据我所知,最大的问题是如何让某些元素在一段时间后过期。我有类似的要求,我创建了一个实现 Delayed Interface 的消息类.这个类包含消息所需的一切,并(通过延迟接口(interface))告诉我它何时过期。

我在并发集合中使用了该对象的实例,您可以使用 ConcurrentMap因为它将允许您使用整数键来键入这些对象。

我每隔一段时间就收集一次,移除延迟已经过去的项目。我们使用 Delayed 接口(interface)的 getDelay 方法来测试是否过期:

message.getDelay(TimeUnit.MILLISECONDS);

我使用了一个普通的线程,它会 hibernate 一段时间然后获取过期的项目。在我的要求中,延迟到期后立即删除这些项目并不重要。看来你有类似的灵 active 。

如果您需要在延迟到期后立即删除项目,那么您可以 hibernate 等待最先到期的消息的延迟,而不是在收割线程中 hibernate 一段时间。

这是我的延迟消息类:

class DelayedMessage implements Delayed {

long endOfDelay;
Date requestTime;
String message;

public DelayedMessage(String m, int delay) {
requestTime = new Date();
endOfDelay = System.currentTimeMillis()
+ delay;
this.message = m;
}

public long getDelay(TimeUnit unit) {
long delay = unit.convert(
endOfDelay - System.currentTimeMillis(),
TimeUnit.MILLISECONDS);
return delay;
}

public int compareTo(Delayed o) {
DelayedMessage that = (DelayedMessage) o;
if (this.endOfDelay < that.endOfDelay) {
return -1;

}
if (this.endOfDelay > that.endOfDelay) {
return 1;
}
return this.requestTime.compareTo(that.requestTime);
}

@Override
public String toString() {
return message;
}
}

关于java - 查找从某个键到某个键的消息,同时能够删除陈旧的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2824268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com