java cache hashmap每日到期

我想有一个HashMap ,每天午夜,缓存都会过期。

请注意它是J2EE解决方案,因此多个线程可以访问它。

在Java中实现它的最佳方法是什么?

虽然其他建议可以用来计算到期时间,但重要的是要注意:

可以懒惰地完成hashmap的到期

即没有任何监控线程!

因此,实现到期的最简单方法如下:

1) 扩展哈希映射 ,并创建一个本地的nextMidtime(Long)变量,在构造函数中初始化为System.currentTime …. 这将被设置为等于下午夜时间,以毫秒为单位……

2) 将以下代码段添加到“containsKey”和“get”方法的第一行(或任何其他负责确保数据不陈旧的方法),如下所示:

 if (currentTime> nextMidTime) this.clear(); //Lets assume there is a getNextMidnight method which tells us the nearest midnight time after a given time stamp. nextMidTime=getNextMidnight(System.currentTimeInMilliseconds); 

您希望在午夜时间刷新hashmap中的每一件事吗?

如果是这样,我想我会创建一个新的hashmap并将其替换为原始的。 由于替换是在一个步骤中完成的,并且没有其他任何东西试图进行相同的更改,我认为它应该是线程安全的。

中途访问中的任何内容都将被允许完成访问。 这假定没有其他任何东西持有对这个hashmap的引用。

如果对hasmap的引用没有合并到一个点,那么我想hashmap.clear()是最好的选择,如果hashmap是同步的。

如果hashmap没有同步,那么你只能从一个线程修改它,对吗? 让该线程调用hashmap.clear()

我认为这涵盖了所有案例。

您还可以考虑使用Guava的CacheBuilder ,它允许您创建Cache接口的自定义实例。 在其他有用的function中, CacheBuilder允许您为自己的目的设置定时到期等。

编辑:我应该注意你根据最后一次访问或最后一次写入设置条目的到期,所以这个建议不符合你要求的确切,即每晚刷新一次。 如果使用第三方API,您可能仍会考虑更改您的设计。 Guava是一个非常聪明的图书馆恕我直言,而不仅仅是缓存。

java.util.Timerjava.util.TimerTask可能certificate是有用的。

创建一个可以清除或重新创建HashMapTimerTask ,并通过Timer实例安排它在午夜执行。

例如:

 // Public single shared hash map. static Map cached_map_ = new HashMap(); public class Hash_map_resetter extends TimerTask { // Constructor takes reference to containing // Timer so it can reset itself after execution. Hash_map_resetter(Timer a_timer) { timer_ = a_timer; } // Clear cache. public void run() { cached_map_ = new HashMap(); System.out.println("Cached cleared"); timer_.schedule(new Hash_map_resetter(timer_), 100); } // Reference to containing Timer. private final Timer timer_; } // Example initiation. Timer t = new Timer(); t.schedule(new Hash_map_resetter(t), 100); 

该示例每100毫秒重置一次。 有许多Timer.schedule()方法,有些采用Date并允许你指定午夜。