0

我只想在tomcat java web应用程序的集合中存储一些值一段时间。

场景是:

  • value1首先添加
  • value21 分钟后添加value1
  • value3在添加之后value2添加
  • value4添加后 2 分钟value1添加

此值应仅在添加后 5 分钟内可用。5 分钟后,它们应从列表中删除。无论上次访问时间如何,每个值都会在 5 分钟后(添加后)过期。

我已经开始使用ConcurrentHashMapand来实现这一点ScheduledExecutor

我找不到适合此要求的内置缓存机制,如果使用缓存,如果更频繁地访问值,它将不会从列表中删除/过期值。

如果有人能给我一个指导或参考任何现有的实现,我将不胜感激。

4

4 回答 4

3

谷歌番石榴可以做到这一点(很简单)

com.google.common.cache.Cache<Integer, String> values = CacheBuilder.newBuilder().concurrencyLevel(4).expireAfterWrite(5, TimeUnit.MINUTES).maximumSize(20).build();        

values.put(someKey, "string val");
于 2012-07-31T07:55:31.447 回答
1

java.util.* 中没有这样的集合。

一种选择是使用番石榴的Cache。可以通过CacheBuilder创建实例。在您的情况下,最有趣的方法是expireAfterWrite

于 2012-07-31T06:33:33.530 回答
1

如果您想手动执行此操作,这是一个简单的想法:

  1. 创建一个类,用日期包装您要存储的类型。
  2. Extend HashMap,覆盖该get()方法,使其检查日期,null如果日期太旧则返回,否则返回存储的对象。

编辑:

如果内存有问题,您可以每 X 分钟迭代一次映射以删除过期值。为此,在被覆盖的get()方法中检查上次清理日期,如果超过 X 分钟,请立即进行清理。但如果你没有记忆问题,你甚至可以跳过这个。

于 2012-07-31T08:02:10.730 回答
0

如果您正在谈论存储每个客户端 cookie 的值,则可用于此目的。

于 2012-07-31T06:44:09.473 回答