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

Sca*_*dge 5 java xsd ehcache ehcache-3

我想要完成的是为缓存设置 TTL(生存时间)和 TTI(空闲时间),以便密钥要么在 TTL 时间之后过期,要么可以提前过期以防万一TTI 期间访问。

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

<cache name="my.custom.Cache"
       timeToIdleSeconds="10"
       timeToLiveSeconds="120">
</cache>
Run Code Online (Sandbox Code Playgroud)

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

<cache alias="my.custom.Cache">
    <expiry>
        <tti unit="seconds">10</tti>
        <ttl unit="minutes">2</ttl>
    </expiry>
</cache>
Run Code Online (Sandbox Code Playgroud)

问题是这样的配置被认为是无效的,因为ehcache.xsd声明标签下应该只有一个选项expiryttittl,但不能同时存在)。

Hen*_*nri 8

正如Louis Jacomet邮件列表中提到的:

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

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

该方法Expiry作品的Ehcache 3略有不同,因为我们实际上创建,访问或更新的映射每次计算的到期时间。这样做是为了减少存储映射的开销。

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

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