java - 在 Ehcache 3 XML 配置中同时设置 TTL 和 TTI

标签 java xsd ehcache ehcache-3

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

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

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

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

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

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

最佳答案

Louis Jacomet 所述在 mailing list 上:

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

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

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

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

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

关于java - 在 Ehcache 3 XML 配置中同时设置 TTL 和 TTI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412225/

相关文章:

java - 基本属性访问器 :167 - IllegalArgumentException in class in Struts

java - Java排序List时出现错误 "no suitable method found"

java - 如何在 java 中获取 String java.util.Map.Entry.getKey() 的大小?

sql - sql 中的 xml select 出现问题 - 似乎无法按正确的顺序组织多个节点

mysql - 将数据库表结构转换为XSD格式

java - Ehcache 2.10 线程被阻塞

Java配置文件问题

Java:将 XML 模式本身绑定(bind)到类

java - ehcache 或 Spring MVC 的 Spring 缓存中的最佳缓存实践是什么?

hibernate - Ehcache 存储但不检索(Ehcache + Hibernate)