寻找一个重新启动持久的LRU磁盘缓存解决方案在Java - ehcache, guava, JCS不符合条件



我们有一个处理图像数据的应用程序,运行在一台机器上。该处理非常昂贵(10到30秒),因此我们将结果文件缓存到磁盘上。这些文件也很大,所以我们必须在达到可配置边界时修剪缓存。缓存的图像文件本身由不同的非java进程创建。还有一些用户操作可能导致某些缓存项无效。

当前实现:

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


缓存提供程序的要求:

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

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

这就是为什么通用框架不符合条件:

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

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

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

看看Infinispan。我想它涵盖了你所有的要求。

最新更新