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