java缓存哈希映射每天过期

java缓存哈希映射每天过期,java,caching,monitoring,lazy-evaluation,Java,Caching,Monitoring,Lazy Evaluation,我想要一个HashMap,每天午夜,缓存将过期 请注意,它是J2EE解决方案,因此多个线程可以访问它 在Java中实现它的最佳方式是什么?Java.util.Timer和Java.util.TimerTask可能会被证明是有用的 创建一个TimerTask,可以清除或重新创建HashMap,并通过Timer实例安排在午夜执行 例如: // Public single shared hash map. static Map<String, String> cached_map_ = n

我想要一个
HashMap
,每天午夜,缓存将过期

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


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

Java.util.Timer
Java.util.TimerTask
可能会被证明是有用的

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

例如:

// Public single shared hash map.
static Map<String, String> cached_map_ = new HashMap<String, String>();

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<String, String>();
        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);
//公共单共享哈希映射。
静态映射缓存_Map_Map=新HashMap();
公共类哈希映射重置器
扩展时间任务
{
//构造函数引用包含
//计时器,以便它可以在执行后重置自身。
哈希映射重置器(计时器a计时器){Timer=计时器;}
//清除缓存。
公开募捐
{
缓存的_map_map=新HashMap();
System.out.println(“缓存清除”);
定时器调度(新哈希映射重置器(定时器),100);
}
//包含计时器的引用。
专用最终定时器;
}
//示例启动。
定时器t=新定时器();
t、 时间表(新哈希映射重置器(t),100);
该示例只是每100毫秒重置一次。
有许多
Timer.schedule()
方法,有些方法采用
日期
并允许您指定午夜。

您希望哈希映射中的每一项都在午夜刷新吗

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

任何处于中间访问的内容都将被允许完成其访问。这假定没有任何其他内容包含对此hashmap的引用

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

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


我认为这涵盖了所有情况。

您还可以考虑使用Guava,它允许您创建其界面的自定义实例。在其他有用的功能中,
CacheBuilder
允许您为自己的目的设置定时过期等


编辑:我应该注意,您根据或设置条目的过期时间,因此此建议不符合您的要求,即每晚冲洗所有内容一次。如果使用第三方API是一种选择,您可能仍然会考虑更改设计。Guava是一个非常智能的库IMHO,不仅仅用于缓存。

尽管其他建议可以延长到期时间,但需要注意的是:

hashmap的过期可以延迟完成

i、 没有任何监视器线程

实现过期的最简单方法如下:

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名为“cache”,那么安全清除它的代码将是“cache=newhashmap();”我从哪里启动计时器?哪个班?@Odelya,唯一的要求是它可以访问您希望重置的
HashMap
,这样您就可以在包含
HashMap
的类中定义一个嵌套类,并在外部类的构造函数中启动计时器。我还需要像这样声明HashMap:Map-activationToimg=Collections.synchronizedMap吗(新HashMap());使用syncrhonizedMap?谢谢!我实际上使用了JODA进行时间处理:DateTime日期=新DateTime().toDateMidnight().toDateTime();DateTime明天=日期。plusDays(1);nextMidtime=明天。getMillis();酷-很高兴这起作用。synchronized map声明不会有任何伤害……它将清理您的代码,这样您就不必担心现场同步。关于扩展:我希望您可以扩展synchronized map方法返回的任何内容。