Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching 番石榴缓存&x27;写入后到期';似乎并不总是有效 private Cache responseCache=CacheBuilder.newBuilder() .最大尺寸(10000) .expireAfterWrite(10,时间单位:分钟) .build();_Caching_Guava - Fatal编程技术网

Caching 番石榴缓存&x27;写入后到期';似乎并不总是有效 private Cache responseCache=CacheBuilder.newBuilder() .最大尺寸(10000) .expireAfterWrite(10,时间单位:分钟) .build();

Caching 番石榴缓存&x27;写入后到期';似乎并不总是有效 private Cache responseCache=CacheBuilder.newBuilder() .最大尺寸(10000) .expireAfterWrite(10,时间单位:分钟) .build();,caching,guava,Caching,Guava,我希望在10分钟内未发送到客户端的响应对象会自动过期并从缓存中删除,但我注意到响应对象并不总是在10、15、20分钟后过期。当缓存被大量填充时,它们确实会过期,但当系统变为空闲时(比如最后500个响应对象),它会停止删除这些对象。 有人能帮助理解这种行为吗?谢谢这在文档中有详细说明: 如果请求expireAfterWrite或expireAfterAccess,则在每次修改缓存、偶尔访问缓存或调用cache.cleanUp()时,都可能逐出条目。Cache.size()可以对过期条目进行计数,但

我希望在10分钟内未发送到客户端的响应对象会自动过期并从缓存中删除,但我注意到响应对象并不总是在10、15、20分钟后过期。当缓存被大量填充时,它们确实会过期,但当系统变为空闲时(比如最后500个响应对象),它会停止删除这些对象。
有人能帮助理解这种行为吗?谢谢

这在文档中有详细说明:

如果请求expireAfterWrite或expireAfterAccess,则在每次修改缓存、偶尔访问缓存或调用cache.cleanUp()时,都可能逐出条目。Cache.size()可以对过期条目进行计数,但读写操作永远看不到过期条目

维基上还有更多细节:

使用CacheBuilder构建的缓存不会“自动”执行清理和逐出值,也不会在值过期后立即执行清理和逐出值,或者执行任何类似操作。相反,它在写操作期间执行少量维护,如果很少写,则在偶尔的读操作期间执行少量维护

原因如下:如果我们想执行缓存 持续维护,我们需要创建一个线程 操作将与用户操作竞争共享锁。 此外,某些环境限制线程的创建, 这将使CacheBuilder在该环境中不可用

相反,我们把选择权交给了你。如果你的缓存是 高吞吐量,那么您就不必担心执行缓存 清理过期条目等的维护。如果你的缓存 很少写入,并且您不希望清除阻止缓存 读取,您可能希望创建自己的维护线程,该线程调用 每隔一定时间缓存.cleanUp()

如果要为缓存安排定期缓存维护,则 很少有写操作,只需使用 ScheduledExecutorService


只需从文件中复制,而不是impressed@SimonGuo《博士》的大部分内容都是我写的。@LouisWasserman:我有个问题。如果我使用expireAfterAccess并假设我的条目在2小时后过期。现在,如果我在一段时间后(比如5小时)为该条目调用get(),它会再次被缓存吗?或者它会永远过期吗?@Boola它会再被缓存两个小时。我想这里的错误沟通是会有另一个缓存加载。一旦条目过期,对get的调用将导致重新加载该条目,然后再次缓存该条目。
private Cache<Long, Response> responseCache = CacheBuilder.newBuilder()
            .maximumSize(10000)
            .expireAfterWrite(10, TimeUnit.MINUTES)
            .build();