基于日期的ehcache
我正在使用ehcache 2.5.4。
我有一个对象需要在白天缓存,并在每天00:00 am刷新一个新值。
目前使用ehcache配置我只能设置生存时间和空闲时间,但这取决于我创建对象的时间或使用时间。 即:
有没有办法让ehcache根据特定时间使特定缓存过期。
我通过扩展Ehcache的Element
类来完成这个:
class EvictOnGivenTimestampElement extends Element { private static final long serialVersionUID = ...; private final long evictOn; EvictOnGivenTimestampElement(final Serializable key, final Serializable value, final long evictOn) { super(key, value); this.evictOn = evictOn; } @Override public boolean isExpired() { return System.currentTimeMillis() > evictOn; } }
其余的就像将EvictOnGivenTimestampElement
对象的新实例放入缓存而不是Element
。
这种方法的优点是你不必担心外部cronjobs等。明显的缺点是Ehcache API的附件,我希望不会经常改变。
EHCache仅在一段时间后(无论是在缓存中还是由于不活动)支持驱逐。 但是,您应该能够通过使用以下方式安排删除来相当容易地完成此操作:
Timer t = new Timer(true); Integer interval = 24 * 60 * 60 * 1000; //24 hours Calendar c = Calendar.getInstance(); c.set(Calendar.HOUR, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); t.scheduleAtFixedRate( new TimerTask() { public void run() { Cache c = //retrieve cache c.removeAll(); } }, c.getTime(), interval);
此基本示例使用Java Timer类来说明,但可以使用任何调度程序。 每隔24小时,从午夜开始 – 这将运行并从指定的缓存中删除所有元素。 可以修改实际的run
方法以删除与特定条件匹配的元素。
您只需要确保在应用程序启动时启动它。
使用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,因为你不需要创建自己的’元素’并确保它用于启动到期或驱逐策略。 策略现在是缓存绑定的。
- Ehcache磁盘存储不干净关机
- 运行时的Ehcache缓存大小
- java.lang.NoClassDefFoundError:org / hibernate / cache / EntityRegion配置EHCache
- Spring MVC的ehcache或spring cache中最好的Cache实践是什么?
- Hibernate缓存策略
- 如何在不使用hibernate / spring拦截器的情况下为独立Java程序配置EHcache?
- 如何使用Spring清除所有Hibernate缓存(ehcache)?
- 使用Ehcache弹出@Cacheable,spel为有效对象找到null
- EhCache:简单程序不起作用