0

我在缓存中设置了 timeToIdle 和 timeToLive 属性。它们分别设置为 10 分钟和 1 小时。

每 5 分钟,我有一个 cron 作业调用getKeysWithExpiryCheck()对缓存中的元素进行一些处理。我还注册了一个缓存侦听器,以在元素过期或被驱逐时执行一个进程。

我发现只有在缓存变满时才会从缓存中删除元素——尽管调用getKeysWithExpiryCheck. 因为我使用的是 Terrocota 大内存缓存 (4.0.4),所以这总是会锁定我的系统,因为缓存会过期(并执行一个处理)数百万个应该在 TTL 或 TTI 的 5 分钟内处理的条目。

有没有人有什么建议?

4

1 回答 1

0

您是正确的,元素在过期并被访问之前不会被驱逐。看看文档是怎么说的:

如果条目过期但未被访问,并且没有资源限制强制驱逐,则过期条目保留在原地。

不幸的是,虽然调用 getKeysWithExpiryCheck() 只会返回尚未过期的密钥,但它不会强制驱逐过期的元素。仍然在这种情况下,一次被驱逐的大量元素不应该锁定您的系统。当您的系统锁定时,您是否进行过线程转储或查看您的 GC 日志以验证是什么导致一切变慢?

于 2014-07-09T07:06:35.323 回答