[已编辑]我正在重新编写我的问题,希望这次能够遵循规则提出好的问题并询问“足够狭窄”的话题。我保留我最初提供的信息,以防任何读者对细节感兴趣。
我的问题:
我一直在研究免费的 Java 缓存库,我发现它们都提供或多或少相同的功能。但是有 2 个工具比其他工具更突出,因为它们提供了一个独特的功能:
- EHCache:提供缓存元素的统计信息。在任何时候,您都可以获得每个元素的元数据,可以访问详细信息,例如命中计数 - 条目在缓存中时被请求的次数。
- Infinispan:提供基于持久性的机制来保存缓存数据。这允许应用程序在重新启动时不会丢失缓存的元素。支持多种持久性方法,例如数据库和文件系统。
我想知道是否有另一个库结合了这两个强大的功能。有人知道吗?
谢谢你。
我的原帖:
我正在开发一个提供对报告层的访问的组件。报告是按需生成的,但是当给定的报告已经运行时,结果(Java 对象)可以被缓存并在以后再次请求相同的报告时再次提供,而无需再次进入报告引擎。
我需要将缓存项目的数量限制为“ X ”(可配置)。当缓存大小达到“ X ”元素并且请求新的(未缓存的)报告时,我需要删除“最不常用”条目(LFU)。
当数据仓库中的报告数据发生变化时,我的组件会收到通知。在这种情况下,我需要:
- 找出哪些是“ Y ”“最常用”的报告(即Y < X)。
- 使缓存无效。
- 通过报告引擎重新生成这些报告。
- 重新缓存它们。
这些都是大多数缓存工具/库通常提供的所有操作。
对我来说,另一个要求是缓存的报告必须能够在 JVM 重新启动后继续存在。也就是说,我不能丢失哪些是缓存条目的信息,并且每次重新启动我的应用程序时我都不能重新生成它们 - 因为它会给报告引擎带来太多负载。
我的问题:我找不到满足我所有需求的免费图书馆。总之,这些将是必需的功能:
- 免费/商业友好的许可证。
- 持久存储,在 JVM/服务器重启/崩溃时保存状态。
- Java API,提供元素统计信息。我需要能够“选择缓存中的前 X 个元素” - 使用驱逐算法排名作为排序。
- 易于与在 Tomcat 上运行的应用程序集成。
我找到的最接近的选项是 EHCache。它公开了每个元素的命中计数 - 但不是驱逐算法使用的“真实”排名。此外,持久可重启机制仅适用于来自 Terracotta 的非免费版本 - BigMemory。
我见过的其他替代方案是 Infinispan,但它不公开入门级统计信息 - 只有缓存级统计信息 - 并且需要 JMX。