基于日期的ehcache

我正在使用ehcache 2.5.4。

我有一个对象需要在白天缓存,并在每天00:00 am刷新一个新值。

目前使用ehcache配置我只能设置生存时间和空闲时间,但这取决于我创建对象的时间或使用时间。 即:

 

有没有办法让ehcache根据特定时间使特定缓存过期。

我通过扩展Ehcache的Element类来完成这个:

 class EvictOnGivenTimestampElement extends Element { private static final long serialVersionUID = ...; private final long evictOn; EvictOnGivenTimestampElement(final Serializable key, final Serializable value, final long evictOn) { super(key, value); this.evictOn = evictOn; } @Override public boolean isExpired() { return System.currentTimeMillis() > evictOn; } } 

其余的就像将EvictOnGivenTimestampElement对象的新实例放入缓存而不是Element

这种方法的优点是你不必担心外部cronjobs等。明显的缺点是Ehcache API的附件,我希望不会经常改变。

EHCache仅在一段时间后(无论是在缓存中还是由于不活动)支持驱逐。 但是,您应该能够通过使用以下方式安排删除来相当容易地完成此操作:

  Timer t = new Timer(true); Integer interval = 24 * 60 * 60 * 1000; //24 hours Calendar c = Calendar.getInstance(); c.set(Calendar.HOUR, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); t.scheduleAtFixedRate( new TimerTask() { public void run() { Cache c = //retrieve cache c.removeAll(); } }, c.getTime(), interval); 

此基本示例使用Java Timer类来说明,但可以使用任何调度程序。 每隔24小时,从午夜开始 – 这将运行并从指定的缓存中删除所有元素。 可以修改实际的run方法以删除与特定条件匹配的元素。

您只需要确保在应用程序启动时启动它。

使用Ehcache 3.2,我实现了Expiry扩展。

 public class EvictAtMidnightExpiry implements Expiry { @Override public Duration getExpiryForCreation(Object key, Object value) { DateTime now = new DateTime(); DateTime resetAt = now.plusDays(1).withTimeAtStartOfDay(); long difference = resetAt.toDateTime().getMillis() - now.getMillis(); return Duration.of(difference, TimeUnit.MILLISECONDS); } @Override public Duration getExpiryForAccess(Object key, ValueSupplier value) { return null; } @Override public Duration getExpiryForUpdate(Object key, ValueSupplier oldValue, Object newValue) { return null; } } 

现在,我也有日志记录等,但我最小化了我的代码清洁度。

然后,您只需在配置构建器中对其进行配置。

 CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class, ResourcePoolsBuilder.heap(1000)).withExpiry(new EvictAtMidnightExpiry()).build() 

很明显,Ehcache在API上有所改进,从2.5到3.2,因为你不需要创建自己的’元素’并确保它用于启动到期或驱逐策略。 策略现在是缓存绑定的。