【问题标题】:Set up both TTL and TTI in Ehcache 3 XML configuration在 Ehcache 3 XML 配置中设置 TTL 和 TTI
【发布时间】:2017-04-14 13:10:58
【问题描述】:

我想要完成的是为缓存设置 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,但不能同时使用) .

【问题讨论】:

    标签: java xsd ehcache ehcache-3


    【解决方案1】:

    正如Louis Jacometmailing list 上提到的:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2019-03-24
      相关资源
      最近更新 更多