防止条目从Guava缓存中逐出

时间:2015-10-20 06:46:31

标签: java caching guava google-guava-cache

我正在浏览Guava Cache示例,并想知道是否有办法防止某些条目在某种情况下从缓存中逐出。

就像,如果某个应用程序正在使用某个条目,那么您不太可能希望它被驱逐!

我认为有一种方法是使用基于大小的驱逐的CacheBuilder.weigher()方法,如Javadoc所述:

  

当条目的权重为零时,不会考虑基于大小的驱逐(尽管它仍可能通过其他方式驱逐)。

但是权重在开头计算,并且在缓存条目的生命周期内是静态的。因此,当应用程序不再使用某个条目时,其权重不能设置为零。

有没有其他有效的方法来实现这一目标?比如,在驱逐特定条目之前,Guava Cache会调用一个方法,无论它是否应该被驱逐!

另外,在MVP应用程序中缓存Presenter实例是不是一个坏主意?因为,我将使用Guava Cache在我的应用程序中缓存Presenter实例!

1 个答案:

答案 0 :(得分:1)

如果您不希望缓存条目在使用中被逐出,则应使用reference-based eviction,特别是.weakValues()。一旦应用程序的其他部分没有引用该条目,这将从缓存中删除该条目。

如果您想使用基于参考的驱逐某些其他驱逐策略(例如,一小时后驱逐,如果当前未在其他地方引用),您可以使用两个兄弟缓存。一个使用参考驱逐,另一个使用定时驱逐。由于第二个缓存拥有强引用,因此它将阻止其他队列驱逐该条目(并且一旦定时缓存逐出,引用缓存就可以自由地执行此操作)。您可以将其实现为自定义Cache实施,以便来电者不需要跟踪簿记。