我们有一个处理图像数据的应用程序,在单台机器上运行。处理非常昂贵(10 到 30 秒),因此我们将生成的文件缓存在磁盘上。这些文件也很大,因此我们必须在缓存达到可配置边界时对其进行修剪。缓存的图像文件本身是由不同的非 Java 进程创建的。并且有些用户操作可能会导致某些缓存条目变得无效。
当前实施:
目前我们正在为此使用自定义缓存管理器,并将一些元数据单独存储在文件系统结构中。
缓存提供者的要求:
我研究了几个 Java 缓存解决方案,但似乎没有一个符合我们的要求。
- 溢出到磁盘(我们不能将整个缓存保存在内存中,因为 RAM 非常有限)
- 关机时持久,启动时读取(不能是故障安全,但至少是尽力而为)
- LRU驱逐策略
- 磁盘和内存缓存的大小限制(不同)最大元素数
- 自定义缓存驱逐侦听器(通知第二个系统)
这就是常见框架不符合条件的原因:
ehcache在点(1)和(2)上失败,因为不能同时拥有两者
JCS在第(5)点失败,因为无法对磁盘缓存逐出事件做出反应
Guava在第(1)点失败,因为没有溢出到磁盘选项
任何建议表示赞赏。