如何在ehcache中区分生存时间和空闲时间


103

关于ehache的文档说:

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不再适用?

Answers:


156

timeToIdleSeconds使缓存的对象的保留时间短于要求的时间timeToIdleSecondstimeToLiveSeconds无论经过多少次或何时请求,都会使缓存的对象在那几秒钟后失效。

这么说吧timeToIdleSeconds = 3。然后,如果4秒钟内未请求该对象,则该对象将无效。

如果为timeToLiveSeconds = 90,则即使在短寿命的90秒内请求了几毫秒的时间,对象也会在90秒后从缓存中删除。


1
因此,我想我们总是想将
空闲时间

在上面的注释中,当您说“让我们说timeToIdleSeconds = 3时。如果4秒钟内未请求对象,则该对象将无效。”,当您说无效时-这是什么意思?它会从堆中删除它吗?如果将对象从缓存中删除,那么我对timeToLive参数的用途完全感到困惑。当我们进行POC时,我们看到timetoIdleseconds之后是从源中获取数据。尽管timetoLive的值高得多,但我希望它是从缓存中获取的,因为在我们的例子中,timetoLive的值比timeToIdle高得多。
Gayathri '01

3
@Gayathri如果您有一个经常(每两秒钟)访问一次但TTL为六十秒的数据项。即使它被连续访问(从不空闲),它仍将每60秒从源中拉出一次。
C. Ross

8
作为对第一条评论的后续行动(@JacquesRenéMesrine)。对于同时设置TTL和TTI(即大于零)的情况:1)TTI> = TTL:TTI 不起作用。条目被认为是过期creationTime + TTL2)TTI <TTL:条目被认为是过期min((max(lastAccessTime, creationTime) + TTI), (creationTime + TTL))
铁木尔Milovanov

“不管”->“不管”
Magnus

41

如果同时设置两者,expirationTime则将为Math.min(ttlExpiry, ttiExpiry),其中

ttlExpiry = creationTime + timeToLive
ttiExpiry = mostRecentTime + timeToIdle

完整的源代码在这里


1
现在,这种行为对我来说很有意义。感谢您指出这一点,特别是Math.min部分。
Prakash K

该代码比上面的人工解释更清楚:-)
Maga Abdurakhmanov

22

旧的1.1文档(可在Google Cache中获得,与当前的AFAIK文档相比,它更易于浏览且信息量更大):

timeToIdleSeconds

这是一个可选属性。

有效值是0到Integer.MAX_VALUE之间的整数。

这是元素自上次使用以来应该存活的秒数。使用表示插入或访问。

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

默认值为0。

timeToLiveSeconds

这是一个可选属性。

有效值是0到Integer.MAX_VALUE之间的整数。

这是自元素创建以来应该存活的秒数。创建的方法是使用Cache.put方法插入到缓存中。

0具有特殊含义,即不检查Element的生存时间,即它将永远存在。

默认值为0。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.