如何区分Ehcache中的TTL和TIDLE?

116

ehcache的文档中写道:

timeToIdleSeconds: Sets the time to idle for an element before it expires.
i.e. The maximum amount of time between accesses before an element expires

timeToLiveSeconds: Sets the time to live for an element before it expires.
i.e. The maximum time between creation time and when an element expires.

我理解timeToIdleSeconds

但是这是否意味着在创建并第一次访问缓存项之后,timeToLiveSeconds不再适用?

3个回答

178

timeToIdleSeconds 参数会使缓存对象在被请求时间间隔小于timeToIdleSeconds 的时限内保留在缓存中。而timeToLiveSeconds参数则指定了缓存对象的生命周期,即使该对象在其生命周期内被多次请求,都将在指定秒数后失效。

假设timeToIdleSeconds = 3,那么如果一个对象在4秒内没有被请求,它将会失效。

如果timeToLiveSeconds = 90,那么该对象将在90秒后从缓存中清除,即使在其短暂的生命周期的最后一秒内也只是被请求了几毫秒。


6
所以我认为我们总是希望将空闲时间(idletime)设置为小于生存时间(ttl)。 - Jacques René Mesrine
在上面的注释中,当你说“假设timeToIdleSeconds = 3。如果对象在4秒内没有被请求,则对象将无效。”时,当你说无效(invalidate) - 它是什么意思?它会从堆(heap)中删除吗?如果对象从缓存中被删除,那么我对timeToLive参数的用途感到困惑。当我们进行POC时,我们发现数据在timetoIdleseconds之后从源获取。尽管timetoLive的值要高得多,但在我们的情况下,我本来希望它从缓存中获取,因为timetoLive的值比timeToIdle高得多。 - Gayathri
4
如果你有一个数据项,它被频繁访问(每两秒一次),但其存活时间为60秒。即使该数据项持续被访问(从不闲置),它仍将在每60秒从源中获取一次。 - C. Ross
10
作为对第一条评论的跟进(由@JacquesRenéMesrine提出)。 对于TTL和TTI都设置的情况(即大于零): 1)TTI >= TTL:TTI没有影响。在“creationTime + TTL”之后,条目被认为已过期。 2)TTI < TTL:在min((max(lastAccessTime, creationTime) + TTI), (creationTime + TTL))之后,条目被认为是已过期的。 - Timur Milovanov
"irregardless" -> "无论如何" - Magnus

47
如果您同时设置了两个值,那么expirationTime将是Math.min(ttlExpiry, ttiExpiry),其中

ttlExpiry = creationTime + timeToLive
ttiExpiry = mostRecentTime + timeToIdle

完整源代码请点此


1
现在这个行为对我来说有意义了。感谢你指出来,特别是 Math.min 部分。 - Prakash K
这段代码比上面的人类解释更清晰明了 :-) - Magomed Abdurakhmanov

22

来自旧的1.1文档(可在Google缓存中找到,比当前文档更易浏览和更具信息量,据我所知):

timeToIdleSeconds

这是一个可选属性。

合法值为0到Integer.MAX_VALUE之间的整数。

它是元素自上次使用以来应该存在的秒数。使用意味着插入或访问。

0有特殊含义,即不检查元素的空闲时间,即它将永久保持空闲。

默认值为0。

timeToLiveSeconds

这是一个可选属性。

合法值为0到Integer.MAX_VALUE之间的整数。

它是元素自创建以来应该存在的秒数。创建意味着使用Cache.put方法将元素插入到缓存中。

0有特殊含义,即不检查元素的生存时间,即它将永久存活。

默认值为0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接