这听起来像是……的工作new ObjectOutputStream(new FileOutputStream(STORAGE_DIR + "/" + key + ".dat");
!
说真的 - 最简单的方法是为每个要存储的数据表创建一个文件,将数据序列化并在要读取时使用密钥作为文件名进行查找。
在一个像样的文件系统上,写入可以是原子的(通过写入临时文件然后重命名文件);读/写速度以 10 秒 MBit/秒为单位;通过创建一个简单的目录树可以使查找变得非常有效,例如STORAGE_DIR + "/" + key.substring(0,2) + "/" + key.substring(0,4) + "/" + key
对于数百万个条目应该仍然有效,如果您的文件系统使用索引目录则效率更高;最后,在此之上实现内存支持的 LRU 缓存以实现更快的检索是微不足道的。
关于压缩 - 您可以在存储数据之前使用 Jakarta 的 commons-compress 对数据进行 gzip 甚至 bzip2 压缩。但这是一个优化问题,根据您的应用程序和可用磁盘空间,您最好将 CPU 周期投入到其他地方。
这是我制作的示例实现:http: //geek.co.il/articles/geek-storage.zip。它使用一个简单的接口(远非干净——它只是一个概念的演示),它提供了从具有设定的最大大小的缓存中存储和检索对象的方法。缓存未命中被转移到用户实现进行处理,缓存会定期检查它没有超过存储要求,并会删除旧数据。
我还包括了一个 MySQL 支持的实现来完成和一个基准来比较基于磁盘和基于 MySQL 的实现。在我的家用机器(旧的 Athlon 64)上,磁盘基准测试的得分比封闭基准测试中的 MySQL 实现快两倍(9.01 秒对 18.17 秒)。尽管 DB 实现可能可以调整以获得稍微更好的性能,但我相信它足以很好地说明问题。
您可以随意使用它。