在Ehcache 3 XML配置中设置TTL和TTI

时间:2017-04-14 13:10:59

标签: java xsd ehcache ehcache-3

我想要完成的是为缓存设置TTL(生存时间)和TTI(空闲时间),以便密钥在TTL时间后到期,或者如果在hasn&中它可以提前到期在TTI期间访问过。

在Ehcache 2中,可以使用以下配置:

$files = array();
for($i =0;$_FILES['name'][$i] != NULL;$i++){
      $files[] = array($_FILES['name'][$i], $_FILES['type'][$i], $_FILES['tmp_name'][$i], $_FILES['size'][$i]);
 }

在Ehcache 3中,类似的配置块如下所示:

<cache name="my.custom.Cache"
       timeToIdleSeconds="10"
       timeToLiveSeconds="120">
</cache>

问题是此类配置被视为无效,因为ehcache.xsd指出<cache alias="my.custom.Cache"> <expiry> <tti unit="seconds">10</tti> <ttl unit="minutes">2</ttl> </expiry> </cache> 标记下应该只有一个选项(expiry或{{ 1}},但不是两者。)

1 个答案:

答案 0 :(得分:4)

正如Louis Jacomet上的mailing list所述:

为了实现您的目标,您需要创建一个自定义Expiry,您可以使用3.3.1中引入的Expirations.builder()或自定义的Expiry实现来创建接口

但是请注意,您对Ehcache 2中过期操作的解释略有不正确。组合TTL和TTI时,无论是否访问,该元素对整个TTL仍然有效。但是,如果在接近TTL周期结束时访问它,则最后一次访问时间+ TTI可以使其在缓存中保持更长时间。如果在此期间再次访问,则会再次更新上次访问时间,从而延长映射的生命周期。

Expiry在Ehcache 3中的工作方式略有不同,因为我们每次创建,访问或更新映射时都会计算到期时间。这样做是为了减少存储映射的开销。

因此,如果您将Expiry配置为getExpiryForCreation返回120秒但getExpiryForAccess返回10秒,则创建但永不访问的元素将在120秒后被视为已过期。虽然创建但访问过的元素在最后一次访问后10秒钟将被视为过期,即使该时间仍在120秒内。 当您考虑它时,TTI确实是一个奇怪的概念,我们保持JCache兼容性,但实际上它更接近驱逐而不是到期。因为它正在被读取的价值的新鲜度意味着什么?虽然它确实意味着这在缓存中是一个有用的值,不应该被驱逐。

在XML中,您不能组合使用tti和ttl快捷方式。但您可以通过完全限定的类名配置到期日期。我们应该考虑扩展XML系统,以便您可以在代码中执行一些等效的添加构建器。

相关问题