ehCache缓存是否有自动刷新选项?没有任何调度程序工作?

Does ehCache cache have any option of auto refreshing? without any scheduler job?

在此 cacheManager 中,当超过 getTimeToLive() 的时间限制时不会自动刷新

private void setCacheInstance() {
    cacheManager
            .createCache("rateDataCached", CacheConfigurationBuilder
                    .newCacheConfigurationBuilder(
                            Integer.class, PostageServicesResultHolder.class,
                            ResourcePoolsBuilder.heap(100))
                    .withExpiry(Expirations.timeToLiveExpiration(Duration.of(getTimeToLive(), TimeUnit.MINUTES))).build());
}

private long getTimeToLive() {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("HH.mm");
    Float currentTime = Float.parseFloat(sdf.format(cal.getTime()));
    return (long) ((24.00-currentTime) * 60);
}

你可以configure a loader。一旦缓存值过期,它将加载新值。

然后,在访问时测试一个值是否过期。因此,如果您想这样做的话,目前不可能在后台使它过期并仅使用 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)) {

  // ...
}

我已尝试通过使用到期 class、

来使用日历实例

public class CustomExpiry 实现过期 {

@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;

}

}