java怎么实现定时任务的刷新重置?

比如我要用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;
}

但这样就会存在这样一个问题: 在第一次存入数据的接近一分钟时又更新了一下这条数据, 结果在一分钟到的时候这条数据又马上就被删掉了, 有点不符合要求, 这要怎么解决?

阅读 5k
1 个回答

强烈建议用现成的缓存库(例如 guava cache),因为它们的使用都很简单。你自己写会碰到两个问题:

  1. 如何避免某些已过期的 key 依然存在于缓存中导致内存泄漏?
  2. 如何使多线程访问效率最大化?

看你的问题中的代码,使用了 Timer 来指定一个删除 key 的时间,但是 Timer 的实现是将其放到一个队列里,然后单线程遍历这个队列。想下如果 Cache 里面放入上百万的 key,那么这个队列该多长,执行效率该多低。

回到你的问题本身,你面临的问题是缓存项的超时时间不是固定的,而是会随着每次被访问而推迟,所以不再适合用 Timer 清除。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题