为缓存创建全局(JVM)最大权重的简便方法?

时间:2012-04-10 15:26:59

标签: java guava

我想在我的应用程序中有几个Cache对象,我希望它们共享最大权重。因此,考虑到总权重X,我希望所有缓存中缓存项目的权重总和不超过X.我不知道前面需要多少缓存,缓存也不需要'公平' - 如果一个人被大量使用而其他人没有使用,它应该能够占据全球最大份额。我不希望在缓存上出现错误,因为它被认为已满,而其他缓存大部分未被使用,并且该空间可以由频繁使用的缓存分配。这些将阻止我返回磁盘以获取数据,因此低失误率非常重要。

我考虑过使用Weigher实现,该实现使用保持总缓存权重的静态变量。然后Weigher将返回物体的重量,如果该重量小于总剩余空间,我将按原样返回重量。如果它超过剩余的总重量,我可以返回Long.MAX_VALUE,因此该项目不会被缓存。每个缓存都具有较高的最大权重,可能是Long.MAX_VALUE-1,因此只要我们可以为其计算/分配权重,就可以始终插入元素。

问题是我没有任何方法知道缓存对象的总重量。我可以减少驱逐侦听器的总权重,但是当有东西插入缓存时我无法看到通知,缓存统计也不会在数据中反映这一点。

我可以采用这种方法或方法来实现此功能吗?我有一个处理全局权重的自定义缓存实现,但缺少Guava缓存提供的许多功能,所以我希望尽可能避免重新实现。虽然我不介意尝试将其连接到番石榴缓存,如果你能指出我的方向。

2 个答案:

答案 0 :(得分:2)

Guava缓存根本不会相互交互 - 没有“全局”交互 - 但softValues()是制作“内存敏感”缓存的传统方式,因为软引用是由GC(通常采用全球最近最少使用的顺序),但仅限于内存紧张时。

我甚至不相信Guava缓存内部跟踪他们的总重量 - 我相信他们会按照每个细分跟踪总重量,但是要跟踪总重量需要太多的锁定。

答案 1 :(得分:2)

我只看到一个解决方案:你能用一种复合键将它们组合成一个缓存吗?