Java ehCache是否有自动刷新选项?没有任何调度程序作业?
在这种情况下,当超过时间限制时,cacheManager不会使用getTimeOlive()自动刷新 你可以。一旦缓存值过期,它将加载新值 然后,在访问时测试值是否过期。所以,如果您想让它在后台过期并只使用Ehcache进行预取,目前是不可能的。总的来说,这是没有必要的 如果您真的想这样做,您确实需要自己的调度程序,它将定期获取值以使其过期并预取(通过使用加载程序或放置新值) 如果您想知道,如果Ehcache是在内部执行的,我们会安排清道夫和预取任务。因此,无论谁在做这件事,都需要安排好工作 答案是评论。为了使所有条目在午夜到期,您可以使用自定义到期,它将计算每个条目到午夜的时间。下面是一个示例代码:Java ehCache是否有自动刷新选项?没有任何调度程序作业?,java,ehcache,ehcache-3,Java,Ehcache,Ehcache 3,在这种情况下,当超过时间限制时,cacheManager不会使用getTimeOlive()自动刷新 你可以。一旦缓存值过期,它将加载新值 然后,在访问时测试值是否过期。所以,如果您想让它在后台过期并只使用Ehcache进行预取,目前是不可能的。总的来说,这是没有必要的 如果您真的想这样做,您确实需要自己的调度程序,它将定期获取值以使其过期并预取(通过使用加载程序或放置新值) 如果您想知道,如果Ehcache是在内部执行的,我们会安排清道夫和预取任务。因此,无论谁在做这件事,都需要安排好工作 答
Expiry expiry = new Expiry() {
@Override
public Duration getExpiryForCreation(Object key, Object value) {
long msUntilMidnight = LocalTime.now().until(LocalTime.MAX, ChronoUnit.MILLIS);
return Duration.of(msUntilMidnight, TimeUnit.MILLISECONDS);
}
@Override
public Duration getExpiryForAccess(Object key, ValueSupplier value) {
return null;
}
@Override
public Duration getExpiryForUpdate(Object key, ValueSupplier oldValue, Object newValue) {
return null;
}
};
try(CacheManager cm = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("cache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10))
.withExpiry(expiry))
.build(true)) {
// ...
}
我已经尝试过通过使用Expiry类使用calendar实例 公共类CustomExpire实现到期{
@Override
public Duration getExpiryForCreation(Object key, Object value) {
return Duration.of(getTimeToLive(), TimeUnit.MILLISECONDS);
}
@Override
public Duration getExpiryForAccess(Object key, ValueSupplier value) {
return null;
}
@Override
public Duration getExpiryForUpdate(Object key, ValueSupplier oldValue, Object newValue) {
return null;
}
private long getTimeToLive() {
Calendar now = Calendar.getInstance();
Calendar midnight = Calendar.getInstance();
midnight.set(Calendar.HOUR_OF_DAY,0);
midnight.set(Calendar.MINUTE,0);
midnight.set(Calendar.SECOND,0);
midnight.set(Calendar.MILLISECOND,0);
midnight.add(Calendar.DATE, 1);
long difference = midnight.getTimeInMillis() - now.getTimeInMillis();
System.out.println("caching time : "+ difference);
return difference;
}
}在我的例子中,它的get-time-ToLiveExpiration正确,但当我使用此行检查当前剩余时间rateShopCache.getRateShopCacheFromCacheManager().ContainersKey(标识符)时,它存储静态值&每当time-get-Expire存在任何方法时,都不会刷新它,我可以将时间设置为12:00 am&缓存自动刷新@Henri最简单的方法是让调度器在12:00 am清除缓存。可以选择立即加载新值(使用
put
或get
和加载器)。另一种解决方案是使用自定义到期日,计算每个条目在午夜到期。我已经用一个代码示例更新了我的答案。@Anant666是的,我们可以尝试,但在我的情况下,我必须清除缓存,而不使用任何作业或计划程序。
@Override
public Duration getExpiryForCreation(Object key, Object value) {
return Duration.of(getTimeToLive(), TimeUnit.MILLISECONDS);
}
@Override
public Duration getExpiryForAccess(Object key, ValueSupplier value) {
return null;
}
@Override
public Duration getExpiryForUpdate(Object key, ValueSupplier oldValue, Object newValue) {
return null;
}
private long getTimeToLive() {
Calendar now = Calendar.getInstance();
Calendar midnight = Calendar.getInstance();
midnight.set(Calendar.HOUR_OF_DAY,0);
midnight.set(Calendar.MINUTE,0);
midnight.set(Calendar.SECOND,0);
midnight.set(Calendar.MILLISECOND,0);
midnight.add(Calendar.DATE, 1);
long difference = midnight.getTimeInMillis() - now.getTimeInMillis();
System.out.println("caching time : "+ difference);
return difference;
}