我们有一个处理图像数据的应用程序,运行在一台机器上。该处理非常昂贵(10到30秒),因此我们将结果文件缓存到磁盘上。这些文件也很大,所以我们必须在达到可配置边界时修剪缓存。缓存的图像文件本身由不同的非java进程创建。还有一些用户操作可能导致某些缓存项无效。
当前实现:
目前我们使用自定义缓存管理器,并将一些元数据单独存储在文件系统结构中。
缓存提供程序的要求:
我已经研究了几个Java缓存解决方案,但似乎没有一个符合我们的要求。
- 溢出到磁盘(我们无法将整个缓存保留在内存中,因为RAM非常有限)
- 在关机时持久,在启动时读取(不能是failsafe,但至少是尽最大努力)
- LRU驱逐策略
- 磁盘和内存缓存的大小限制按(不同)最大元素数
- 自定义缓存退出监听器(通知第二个系统)
这就是为什么通用框架不符合条件:
ehcache在点(1)和(2)上失败,因为一个人不能同时拥有
JCS在点(5)上失败,因为无法对磁盘缓存驱逐事件做出反应
Guava在点(1)上失败,因为没有溢出磁盘选项
看看Infinispan。我想它涵盖了你所有的要求。