2017-04-14 37 views
0

我想完成的是为缓存设置TTL(生存时间)和TTI(时间到空闲),以便密钥在TTL时间,或者在TTI期间未被访问的情况下可以提前过期。在Ehcache 3 XML配置中设置TTL和TTI

在的Ehcache 2有可能具有以下配置:

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

在的Ehcache 3类似的配置块看起来如下:

<cache alias="my.custom.Cache"> 
    <expiry> 
     <tti unit="seconds">10</tti> 
     <ttl unit="minutes">2</ttl> 
    </expiry> 
</cache> 

的问题是,这样的结构被认为是无效因为ehcache.xsd指出应该只有一个选项根据expiry标记(ttittl,但没有两者)。

回答

2

由于在mailing list提及Louis Jacomet

为了达到你想要什么,你需要创建一个自定义的Expiry,您可以用在3.3.1推出了Expirations.builder()做,或者用自定义实现的Expiry接口。

但请注意,您对Ehcache 2中到期内容的解释稍有不正确。当您结合TTL和TTI时,无论是否访问整个TTL,该元素都将保持有效。但是,如果访问时间接近TTL周期的末尾,则上次访问时间+ TTI可以使其在缓存中停留更长时间。如果在此期间再次访问,则上次访问时间会再次更新,从而延长映射的使用期限。

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

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

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