我在缓存上设置了timeToIdle和timeToLive属性。它们分别设定为10分钟和1小时。
每隔5分钟,我就有一个调用getKeysWithExpiryCheck()
的cron作业对缓存中的元素进行一些处理。我还注册了一个缓存监听器,以便在元素过期或被驱逐时执行一个过程。
我发现只有在调用getKeysWithExpiryCheck
时,才会在缓存变满时从缓存中删除元素。因为我使用的是Terrocota Big Memory Cache(4.0.4),所以这总是锁定我的系统,因为缓存然后到期(并执行一个过程)数百万条应该在TTL或TTI的5分钟内处理的条目。
有人有任何建议吗?
答案 0 :(得分:0)
您是正确的,在元素过期和之前,元素不会被驱逐。看看Documentation所说的内容:
如果条目过期但未被访问,并且没有资源限制强行驱逐,那么过期的条目仍然存在。
不幸的是,调用getKeysWithExpiryCheck()只会返回尚未过期的键,它不会强制驱逐过期的元素。仍然在这种情况下,一次被驱逐的大量元素不应该锁定你的系统。您是否在系统锁定时进行了线程转储或查看了GC日志,以验证是什么导致所有内容变慢?