在EHCache 2.x中,可以在缓存中的单个条目上设置生存时间,例如:
Element dependentElement = cache.get(key);
long lastAccessTime = dependentElement.getLastAccessTime();
long creationTime = dependentElement.getCreationTime();
int timeToLive = lastAccessTime == 0 ? 300 : (int)
(lastAccessTime - creationTime) / 1000 + 300;
timeToLive += 2;
dependentElement.setTimeToLive(timeToLive);
这将更新单个项目的TTL,从而使其在缓存中保持更长时间。
在EHCache 3.x中,这似乎不再可能在单个缓存条目的基础上进行。阅读Migration Guide和this question后,在我看来,此功能无法直接迁移。
指南告诉我们,为了修改TTL,必须实现一个接口:
CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class,
String.class, ResourcePoolsBuilder
.withExpiry(new Expiry<Long, String>() {
@Override
public Duration getExpiryForCreation(Long key, String value) {
return getTimeToLiveDuration(key, value);
}
@Override
public Duration getExpiryForAccess(Long key, ValueSupplier<? extends String> value) {
return null; // Keeping the existing expiry
}
@Override
public Duration getExpiryForUpdate(Long key, ValueSupplier<? extends String> oldValue, String newValue) {
return null; // Keeping the existing expiry
}
});
然后将此配置添加到要初始化的缓存中。但是,它确实看起来,因为它是一个缓存级别的扩展点,你永远不能保证为你想要改变的实际条目触发方法吗?
查看EHCache 3的内部结构,似乎已将旧的 net.sf.ehcache.Element 抽象出来并更改为 ValueHolder&lt; V&gt; 并且它不再可能访问它。
所以,问题是:我们如何在EHCache 3.x中实现相同的行为?
答案 0 :(得分:1)
只有当条目创建,已访问或已更新时,才能修改到期时间。
现在,根据您的具体要求,您可以在getExpiryForAccess
上实现特定逻辑并访问映射以获取更新的到期日期。但是,您无法区分常规访问权限和应更新到期时间的访问权限。
并且我不建议无论如何都要进行这样的有状态到期计算。
可能有其他方法通过完全更改缓存设计来支持您的用例,但这不在本问题范围之内。