在 Java 中寻找重启持久性 LRU 磁盘缓存解决方案 - ehcache、guava、JCS 不合格

Looking for a restart-persistent LRU disk caching solution in Java - ehcache, guava, JCS do not qualify

我们有一个处理图像数据的应用程序,运行 在一台机器上。处理过程非常昂贵(10 到 30 秒),因此我们将生成的文件缓存在磁盘上。这些文件也很大,所以我们必须在缓存达到可配置的边界时对其进行修剪。缓存的图像文件本身是由不同的非 Java 进程创建的。并且有些用户操作可能会导致某些缓存条目变得无效。

当前实施:

目前我们正在为此使用自定义缓存管理器,并将一些元数据单独存储在文件系统结构中。


对缓存提供程序的要求:

我研究了几个 Java 缓存解决方案,但 none 似乎符合我们的要求。

  1. 溢出到磁盘(我们不能将整个缓存都保存在内存中,因为RAM非常有限)
  2. 关机时持久,启动时读取(不能是故障安全的,但至少是尽力而为)
  3. LRU驱逐策略
  4. 磁盘和内存缓存的大小限制(不同的)最大元素数
  5. 自定义缓存驱逐侦听器(通知第二个系统)

以下是通用框架不合格的原因:

ehcache 在点 (1)(2) 上失败,因为不能有同时

JCS(5) 点失败,因为无法对磁盘缓存逐出事件做出反应

Guava(1) 点失败,因为没有溢出到磁盘选项

如有任何建议,我们将不胜感激。

看看Infinispan。我认为它涵盖了您的所有要求。