在 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,因为您不需要创建自己的“元素”并确保使用它来启动过期或驱逐策略。这些策略现在是缓存绑定的。