在 Ehcache 3 XML 配置中同时设置 TTL 和 TTI
Set up both TTL and TTI in Ehcache 3 XML configuration
我想要完成的是为缓存设置 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
标签下应该只有 one 选项(tti
或 ttl
,但不能同时使用。
如Louis Jacomet on the mailing list所述:
为了实现你想要的,你需要创建一个自定义的Expiry
,你可以使用3.3.1中引入的Expirations.builder()
,或者自定义实现到期界面。
但是请注意,您对 Ehcache 2 中过期的解释略有不正确。当您组合 TTL 和 TTI 时,该元素对于整个 TTL 仍然有效,无论它是否被访问。但是,如果在接近TTL周期结束时访问,最后访问时间+TTI可以让它在缓存中停留更长时间。如果在此期间再次访问,则会再次更新上次访问时间,从而延长映射的生命周期。
Expiry
在 Ehcache 3 中的工作方式略有不同,因为每次创建、访问或更新映射时,我们都会有效地计算过期时间。这样做是为了减少存储映射的开销。
因此,如果您将 Expiry
配置为 getExpiryForCreation
返回 120 秒但 getExpiryForAccess
返回 10 秒,则创建但从未访问的元素将在 120 秒后被视为过期。虽然创建但访问的元素将在上次访问后 10 秒被视为过期,即使该时间仍在 120 秒内。
当您考虑 TTI 时,它确实是一个奇怪的概念,我们保留它是为了与 JCache 兼容,但它实际上更接近于逐出而不是过期。因为被阅读的值的新鲜度意味着什么?虽然这确实意味着这是缓存中不应该被驱逐的有用值。
并且在 XML 中,您不能组合使用 tti 和 ttl 快捷方式。但是您可以通过完全限定的 class 名称配置到期时间。我们应该考虑扩展 XML 系统,这样您就可以在代码中做一些与添加的构建器等效的事情。
我想要完成的是为缓存设置 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
标签下应该只有 one 选项(tti
或 ttl
,但不能同时使用。
如Louis Jacomet on the mailing list所述:
为了实现你想要的,你需要创建一个自定义的Expiry
,你可以使用3.3.1中引入的Expirations.builder()
,或者自定义实现到期界面。
但是请注意,您对 Ehcache 2 中过期的解释略有不正确。当您组合 TTL 和 TTI 时,该元素对于整个 TTL 仍然有效,无论它是否被访问。但是,如果在接近TTL周期结束时访问,最后访问时间+TTI可以让它在缓存中停留更长时间。如果在此期间再次访问,则会再次更新上次访问时间,从而延长映射的生命周期。
Expiry
在 Ehcache 3 中的工作方式略有不同,因为每次创建、访问或更新映射时,我们都会有效地计算过期时间。这样做是为了减少存储映射的开销。
因此,如果您将 Expiry
配置为 getExpiryForCreation
返回 120 秒但 getExpiryForAccess
返回 10 秒,则创建但从未访问的元素将在 120 秒后被视为过期。虽然创建但访问的元素将在上次访问后 10 秒被视为过期,即使该时间仍在 120 秒内。
当您考虑 TTI 时,它确实是一个奇怪的概念,我们保留它是为了与 JCache 兼容,但它实际上更接近于逐出而不是过期。因为被阅读的值的新鲜度意味着什么?虽然这确实意味着这是缓存中不应该被驱逐的有用值。
并且在 XML 中,您不能组合使用 tti 和 ttl 快捷方式。但是您可以通过完全限定的 class 名称配置到期时间。我们应该考虑扩展 XML 系统,这样您就可以在代码中做一些与添加的构建器等效的事情。