使用Guava自动刷新缓存

时间:2014-11-19 10:04:27

标签: java caching guava


感谢这个论坛(How to automatically refresh Cache using Google Guava?),我了解了番石榴。
我想询问一些有关上述主题的信息(How to automatically refresh Cache using Google Guava?),但我不能为问题撰写评论,因为我的声誉太低了。 因此,我必须创建一个新主题。谢谢你的理解。

看到这段代码,

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

如果一个条目A至少加载了一次她的值, 实际上上面的代码足以每15分钟自动重新加载与密钥A相关的值吗?

当然,正如Frank所提到的,&#34;我重写了MyCacheLoader中的CacheBuilder.reload(K,V)方法,因此它以异步方式执行。&#34; 或者我有代码要添加?如果是的话,在哪里? 非常感谢你

PS:JB,javadoc很完美,但我的英语水平很低。事实上,我的CacheLoader的重写重载看看是否必须为一个密钥执行真正的重新加载,如果是,则实现该密钥的真正重新加载;否则不要为该密钥重新加载缓存。而且,即使在第二种情况下(没有真正的重新加载),我是否每15分钟调用一次重写的重载方法?我想是的,但我是对的吗?感谢

1 个答案:

答案 0 :(得分:9)

使用

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

每15分钟自动刷新一个条目,因为缓存不会创建线程来执行任何类型的管理(过期或刷新条目)。如果您拨打cache.get(someKey),然后在20分钟后再次拨打电话,那么然后会因您的通话而刷新该条目,前提是该条目由于{{1}而未被驱逐当然,到达了。

我不太确定你对maximumSize和异步性的询问。如果你覆盖它,你已经添加了代码,不是吗?希望它不仅仅是对CacheLoader::reload的调用,因为它不是异步的。如果需要,您可以提供更多详细信息。

但是,如前所述,对于任何现有密钥,该方法每15分钟自动调用 ,只有在再次请求条目时才会按需调用该方法。