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.Timer
和java.util.TimerTask
可能certificate是有用的。
创建一个可以清除或重新创建HashMap
的TimerTask
,并通过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
并允许你指定午夜。