我正在使用以下内容:

LoadingCache<String, Long> inQueueLoadingCache = CacheBuilder.newBuilder()
    .expireAfterWrite(120, TimeUnit.SECONDS)
    .removalListener(inQueueRemovalListener)
    .build(inQueueCacheLoader);


每隔120秒,将逐出缓存项,并且缓存项将按预期工作。

我的问题是:如何更改当前缓存的超时值,例如从120秒更改为60秒?在此更改期间,缓存条目将如何处理?

最佳答案

简短的答案:您不能更改逐出超时值或Cache创建的LoadingCache / CacheBuilder的任何属性。

无论如何,为什么要更改超时时间? (也请记住,Guava缓存非常简单。)如果您确实想更改超时,则有两种选择:


使用目标语义创建新的Cache并复制旧的缓存内容,例如。

LoadingCache<String, Long> newCache = CacheBuilder.newBuilder()
    .expireAfterWrite(60, TimeUnit.SECONDS)
    .removalListener(inQueueRemovalListener)
    .build(inQueueCacheLoader);
newCache.putAll(inQueueLoadingCache.asMap());


但您会失去原始访问时间等。
完全不要使用CacheBuilder并自己实现LoadingCache,例如,将AbstractLoadingCache骨架实现与您自己的更改超时策略一起使用。不过,这并不容易,因为您拥有不错的LoadingCache API,但是您必须自己实现整个操作(我尝试过一次,但是最终使用了比Guava更高级的缓存)。

08-18 10:59
查看更多