首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ehcache 3 XML配置中同时设置TTL和TTI

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

Stack Overflow用户
提问于 2017-04-14 13:10:58
回答 1查看 4.9K关注 0票数 6

我试图完成的是为缓存设置TTL (生存时间)和TTI (空闲时间),以便密钥在TTL时间之后过期,或者在TTI期间未被访问时提前过期。

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

代码语言:javascript
运行
复制
<cache name="my.custom.Cache"
       timeToIdleSeconds="10"
       timeToLiveSeconds="120">
</cache>

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

代码语言:javascript
运行
复制
<cache alias="my.custom.Cache">
    <expiry>
        <tti unit="seconds">10</tti>
        <ttl unit="minutes">2</ttl>
    </expiry>
</cache>

问题是,这种配置被认为是无效的,因为ehcache.xsd声明在expiry标记下只应该有一个选项( ttittl,而不是两者都有)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-16 18:13:21

正如路易·雅克梅特邮寄名单上提到的

为了实现您想要的结果,您需要创建一个定制的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快捷方式。但是,您可以通过完全限定的类名来配置到期日期。我们应该考虑扩展XML系统,以便您可以在代码中执行与添加的构建器相当的操作。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43412225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档