private Cache<Long, Response> responseCache = CacheBuilder.newBuilder()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
我预计 10 分钟内未发送到客户端的响应对象会过期并自动从缓存中删除,但我注意到即使在 10、15、20 分钟后,响应对象也并不总是过期。当缓存大量填充时,它们确实会过期,但当系统空闲时,例如最后 500 个响应对象,它会停止删除这些对象。
有人可以帮助理解这种行为吗?谢谢
这是在文档中指定的:
如果请求expireAfterWrite或expireAfterAccess,条目可能会在每次缓存修改、偶尔的缓存访问或调用Cache.cleanUp()时被逐出。过期条目可以通过 Cache.size() 进行计数,但对读或写操作永远不可见。
维基百科上有更多详细信息:
使用 CacheBuilder 构建的缓存不会“自动”执行清理和逐出值,也不会在值过期后立即执行清理和逐出值,或执行类似操作。相反,它会在写入操作期间执行少量维护,或者如果写入很少,则在偶尔的读取操作期间执行少量维护。
原因如下:如果我们要进行Cache
持续维护,我们就需要创建一个线程,及其
操作将与用户操作竞争共享锁。
此外,某些环境限制线程的创建,
这将使 CacheBuilder 在该环境中无法使用。
相反,我们将选择权交给您。如果你的缓存是
高吞吐量,那么你不必担心执行缓存
维护以清理过期条目等。如果你的缓存
确实很少写入,并且您不希望清理阻止缓存
阅读,您可能希望创建自己的维护线程来调用
定期进行 Cache.cleanUp()。
如果您想为某个缓存安排定期缓存维护
很少有写入,只需使用以下命令安排维护
预定的执行者服务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)