我想在我的应用程序中有几个 Cache 对象,我希望它们共享最大权重。因此,给定一些总权重 X,我希望所有缓存中的缓存项的权重总和不超过 X。我不知道预先需要多少缓存,也不需要缓存“公平”——如果一个被大量使用而其他人没有被大量使用,它应该能够占据全球最大值的最大份额。我不希望缓存丢失,因为它被认为已满,而其他缓存大多未使用,并且该空间可以由大量使用的缓存分配。这些将阻止我返回磁盘获取数据,因此低未命中率很重要。
我考虑过使用一个静态变量来保持总缓存权重的 Weigher 实现。然后 Weigher 将返回对象的重量,如果该重量小于总剩余空间,我将按原样返回重量。如果它超过剩余的总重量,我可以返回 Long.MAX_VALUE,这样该项目就不会被缓存。每个缓存都有一个很高的最大权重,可能是 Long.MAX_VALUE-1 ,这样只要我们可以为它计算/分配一个权重,就可以始终插入一个元素。
问题是我看不到任何方法可以知道缓存对象的总重量。我可以减少带有驱逐侦听器的总权重,但是当某些内容插入缓存时,我无法看到收到通知,缓存统计信息也不会在其数据中反映这一点。
是否有任何解决方法或我可以采取的方法来实现此功能?我有一个处理全局权重的自定义缓存实现,但缺少 Guava 缓存提供的许多功能,所以我想尽可能避免重新实现东西。虽然我不介意尝试将它连接到 Guava Cache,如果你能指出我的大致方向。