更改EHCache 3中各个条目的TTL

时间:2017-04-09 12:14:28

标签: java ehcache

在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 Guidethis 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中实现相同的行为?

1 个答案:

答案 0 :(得分:1)

只有当条目创建已访问已更新时,才能修改到期时间。

现在,根据您的具体要求,您可以在getExpiryForAccess上实现特定逻辑并访问映射以获取更新的到期日期。但是,您无法区分常规访问权限和应更新到期时间的访问权限。 并且我不建议无论如何都要进行这样的有状态到期计算。

可能有其他方法通过完全更改缓存设计来支持您的用例,但这不在本问题范围之内。

相关问题