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

7
我要做的是为缓存设置TTL(生存时间)和TTI(空闲时间),以便键在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,但不能同时存在)。
1个回答

11
Louis Jacomet邮件列表中所述:
为了实现您想要的功能,您需要创建一个自定义的Expiry。您可以使用3.3.1版本引入的Expirations.builder()或自定义实现Expiry接口来完成此操作。
但请注意,您对Ehcache 2中过期时间的解释略有不准确。当您将TTL和TTI组合在一起时,无论是否访问该元素,该元素都会在整个TTL期间保持有效。但是,如果它在TTL期限接近到期时被访问,最后访问时间+TTI可能使其在缓存中停留更长的时间。如果在此期间再次访问,则最后访问时间将再次更新,从而延长映射的生命周期。
Ehcache 3中Expiry的工作方式略有不同,因为我们实际上在每次创建、访问或更新映射时计算过期时间。这样做是为了减少存储映射时的开销。
因此,如果您配置了Expiry,其中getExpiryForCreation返回120秒,而getExpiryForAccess返回10秒,则已创建但从未访问的元素将在120秒后被视为过期。而已创建但已访问的元素将在最后一次访问后的10秒内被视为过期,即使该时间仍在120秒内。
TTI实际上是一个奇怪的概念,当您考虑它时,它更接近于驱逐而不是过期。因为对于一个值的新鲜度来说,它被读取意味着什么?尽管确实意味着这是缓存中有用的值,不应该被驱逐。
在XML中,您不能同时使用tti和ttl快捷方式。但是您可以通过完全限定的类名来配置过期。我们应该考虑扩展XML系统,以便您可以执行与代码中添加的构建器相当的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接