1

在此 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);
}
4

2 回答 2

2

您可以配置加载程序。一旦缓存值过期,它将加载新值。

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

  // ...
}
于 2017-06-16T16:17:51.797 回答
0

我尝试通过使用 Expiry 类来使用日历实例,

公共类 CustomExpiry 实现 Expiry {

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

}

}

于 2017-06-21T09:41:33.193 回答