比如我要用Map做一个简单的临时缓存, 然后在数据存进去之后的一分钟后删掉该数据(因为数据的读写比较要求时效性但又只会集中在一段时间内去访问, 所以不太想用定时任务去定期清理整个Map).
我一开始这样写的:
public Object put(final String key, Object value) {
if (key == null || value == null) {
return null;
}
cache.put(key, value);
timer.schedule(new TimerTask() {
@Override
public void run() {
removeData(key);
this.cancel();
}
}, DEFAULT_TIMEOUT);
return value;
}
但这样就会存在这样一个问题: 在第一次存入数据的接近一分钟时又更新了一下这条数据, 结果在一分钟到的时候这条数据又马上就被删掉了, 有点不符合要求, 这要怎么解决?
强烈建议用现成的缓存库(例如 guava cache),因为它们的使用都很简单。你自己写会碰到两个问题:
看你的问题中的代码,使用了 Timer 来指定一个删除 key 的时间,但是 Timer 的实现是将其放到一个队列里,然后单线程遍历这个队列。想下如果 Cache 里面放入上百万的 key,那么这个队列该多长,执行效率该多低。
回到你的问题本身,你面临的问题是缓存项的超时时间不是固定的,而是会随着每次被访问而推迟,所以不再适合用 Timer 清除。