1

我想在我的应用程序中有几个 Cache 对象,我希望它们共享最大权重。因此,给定一些总权重 X,我希望所有缓存中的缓存项的权重总和不超过 X。我不知道预先需要多少缓存,也不需要缓存“公平”——如果一个被大量使用而其他人没有被大量使用,它应该能够占据全球最大值的最大份额。我不希望缓存丢失,因为它被认为已满,而其他缓存大多未使用,并且该空间可以由大量使用的缓存分配。这些将阻止我返回磁盘获取数据,因此低未命中率很重要。

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

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

是否有任何解决方法或我可以采取的方法来实现此功能?我有一个处理全局权重的自定义缓存实现,但缺少 Guava 缓存提供的许多功能,所以我想尽可能避免重新实现东西。虽然我不介意尝试将它连接到 Guava Cache,如果你能指出我的大致方向。

4

2 回答 2

2

Guava 缓存根本不相互交互——没有“全局”交互——但softValues()它是制作“内存敏感”缓存的传统方式,因为软引用由 GC 收集(通常在全局最近-used order),但仅在内存紧张时。

我什至不相信 Guava 缓存在内部会跟踪它们的总重量——我相信它们会在每个段的基础上跟踪总重量,但是跟踪总重量需要太多的锁定。

于 2012-04-10T15:54:20.420 回答
2

我只看到一个解决方案:您可以将它们与某种复合键组合成一个缓存吗?

于 2012-04-11T02:34:11.707 回答