0

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

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

我能想到的一种CacheBuilder.weigher()方法是使用基于大小的驱逐方法,正如 Javadoc 所述:

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

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

有没有其他有效的方法来实现这一目标?就像,在驱逐特定条目之前,番石榴缓存会调用一个方法,无论它是否应该被驱逐!

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

4

1 回答 1

1

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

如果您想使用基于引用的驱逐其他一些驱逐策略(例如一小时后驱逐,如果当前没有在其他地方引用),您可以使用两个同级缓存。一种使用参考驱逐,另一种使用定时驱逐。由于第二个缓存拥有强引用,它将阻止其他队列驱逐条目(并且一旦定时缓存驱逐了引用缓存将可以自由地这样做)。您可以将其实现为自定义Cache实现,以便调用者无需跟踪簿记。

于 2017-03-23T08:06:45.557 回答