2015-10-20 53 views
0

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

就像一个应用程序正在使用某个条目一样,它不太可能会让它被驱逐!

的一种方式,我能想到的是使用CacheBuilder.weigher()方法与基于大小的驱逐,因为Javadoc中指出:

当条目的权重为零,它不会被认为是基于大小的逐出(尽管它仍然可能被其他方式驱逐)。

但权重是在开始时计算的,并且在高速缓存条目的生存期内是静态的。所以,当一个条目不再被应用程序使用时,它的权重不能设置为零。

有没有其他有效的方法来实现这一目标?比如,一个方法将被Guava Cache调用,然后再驱逐一个特定的条目,不管它是否应该被驱逐!

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

+1

您不应该在MVP中缓存演示者,因为它们重量轻,应该流失率低。可能有缓存的应用程序数据,但组件本身应该很薄(例如,主持人调用缓存远程数据的客户端服务)。尽管缓存角度有解决方法,但它听起来像走错了路。 –

+0

但是,由于演示者持有模型和视图,因此应将演示者视为MVP三元组。 MVP黑社会是否也被认为是“轻量级”?另外,我缓存MVP三元组的目的不是为了提高性能,而是为了在我的Swing应用程序中支持“后退前进”导航。此外,如果任何启动演示者的按钮被按下多次,则加载现有的MVP实例。因此,每次点击都不会创建新的MVP三元组!这是我的目的!我知道,这也可以通过其他方式完成,但缓存MVP对我来说似乎是一个好方法! – Akshat

+0

三元组是轻量级的,其中Presenter在模型(哑数据)和视图(哑数据用户界面)之间进行协调。它有智慧,但没有说明。非UI状态的管理是对可能很复杂但封装的客户端服务的委托。通过将状态编码到导航中来管理历史,例如,看看[浏览器历史记录是如何编码的](https://en.wikipedia.org/wiki/Single-page_application#Browser_history)到URL中。后退/前进会创建新的三元组,以提供视图。如果您决定使用缓存,那么弱引用可能更适合。 –

回答

1

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

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