Guava实现自动缓存刷新

4
感谢这个论坛(如何使用Google Guava自动刷新缓存?),我了解了Guava。
我想询问关于上述主题(如何使用Google Guava自动刷新缓存?)的一些信息,但由于我的声望太低而无法写评论来提问。
因此,我不得不创建一个新主题。感谢您的理解。
看到这段代码,
LoadingCache<K, V> cache = CacheBuilder.newBuilder()
        .refreshAfterWrite(15, TimeUnit.MINUTES)
        .maximumSize(100)
        .build(new MyCacheLoader());

如果一个条目A的值被加载至少一次,那么上面的代码是否足以每15分钟自动重新加载与键A关联的值? 当然,如Frank所提到的,“我重写了MyCacheLoader中的CacheBuilder.reload(K, V)方法,使其异步执行。” 还需要添加代码吗?如果需要,应该在哪里添加? 非常感谢。 PS:JB,文档注释很完美,但我的英语水平不够。事实上,我的CacheLoader的重写reload方法看看是否需要为一个键执行真正的重新加载,如果是,则为该键执行真正的重新加载;否则不为该键进行真正的重新加载。即使在第二种情况下(无真正的重新加载),也会每15分钟调用重写的reload方法吗?我认为是这样,但我正确吗?谢谢。

Java文档中有什么不清楚的地方?你的测试显示了什么? - JB Nizet
JB,Java文档非常清晰,但是我的英语水平比较低。 - Thomas
JB,javadoc非常完美,但我的英语水平很低。实际上,我的CacheLoader的重载方法会检查是否需要为一个键执行真正的重新加载,如果是,则为该键执行真正的重新加载;否则不会为该键进行真正的重新加载。即使在第二种情况下(没有真正的重新加载),我的重载方法每15分钟也会被调用吗?我认为是这样的,但我对吗?谢谢。 - Thomas
1个回答

12

使用 LoadingCache 构建的缓存

LoadingCache<K, V> cache = CacheBuilder.newBuilder()
        .refreshAfterWrite(15, TimeUnit.MINUTES)
        .maximumSize(100)
        .build(new MyCacheLoader());

缓存不会自动刷新条目,因为缓存不创建线程进行任何类型的管理(过期或刷新条目)。如果您调用cache.get(someKey),然后在20分钟后再次调用它,则会刷新该条目,前提是该条目尚未由于达到maximumSize而被逐出。

我不太确定您对CacheLoader::reload和异步性的问题是什么。如果您重写了它,那么您已经添加了代码,不是吗?希望这不仅仅是对super.reload(k, v)的调用,因为那不是异步的。如果需要更多细节,请完整地提出您的问题。

如前所述,该方法不会自动调用每15分钟一次现有密钥,仅在重新请求条目时才会调用。


非常感谢你,Franck。 - Thomas
Franck,感谢您的回答。您非常有技巧。我正在学习GUAVA,并且肯定会有其他问题。非常感谢您,祝您晚上愉快。 - Thomas
Frank,我想将你的答案标记为有用,但是由于我的声望太低,我无法这样做。祝你晚上愉快。晚安。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接