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