繁体   English   中英

Java持久键值存储

[英]Java persistent key-value store

我知道这可能已被问过无数次,但我似乎无法找到我的确切用例的黄金解决方案。

我只有一个数据结构,一个地图,其中键是一个字符串。 地图的对象是地图本身,但这次的值是简单的对象/基元,如string,int,double等。所以地图的地图。 最里面的地图的键是常量,即除了创建之外,没有从最里面的地图添加/删除任何条目。 所以它有点像传统的表,尽管每行可能有任意列。

我需要这个数据结构是持久的和复制的。

这是我的要求:

  1. 纯Java解决方案
  2. 磁盘映射仅在重新启动时使用。 因此,从来没有任何从磁盘读取,所有的写入只能由一个应用程序完成)
  3. 嵌入式。
  4. 性能。 现有记录的UPDATE性能很重要。 更新可能每秒发生100k次(但更可能是每秒20-50k)。 至于INSERT / DELETE,它们当然会发生,但可能每天只发生几次。 因此,我不太担心INSERT / DELETE性能。
  5. 复制。 为了恢复,我需要复制地图的磁盘副本。 从主服务器到从服务器的复制不需要是原始事务的一部分,即我可以牺牲一些ACIDness来提高性能。
  6. 记录数量预计为10万至20万,但不会高很多。 每条记录的大小可能是100-200 KB,因此总的来说并不是那么多数据。 我猜测数据文件的总大小将低于100 MB,这可能是偏高的估计值。
  7. 数据总量不超过内存总容量。 (这就是为什么我可以保证没有磁盘读取,除了启动时)
  8. 我的申请没有分发。 在任何给定的时间点,只有一个活动进程写入磁盘。
  9. 自由开源许可证。 (Apache,BSD,LGPL,应该没问题)

有问题的应用程序永远不需要存储除上述数据结构之外的任何内容,即它不会具有其他持久性数据结构的未来发现需求。 因此,基于这种特定的数据结构进行优化是合理的。

我查看了Berkeley DB Java版本,但它未能满足要求#6。 我看过TokyoCabinet / KoyotoCabinet,但它没有达到要求#1。

那么你会推荐什么?

有几个选项,但neo4j似乎符合你的要求。 HBaseCassandra也是选择,但比您可能需要的更多。

你看过Redis了吗? 它是一个内存中的“数据库”(键值存储),恕我直言,满足您的所有需求。

看看HazelCast 除了分发之外,它满足您的大多数要求。

我认为Chronicle Map非常适合你的情况

  • 纯Java,可嵌入的键值存储
  • 内存中,可选择持久保存到磁盘
  • 从单个线程支持每秒1M次写入
  • 具有非阻塞,最终一致的复制,针对高更新率进行了优化
  • LPGLv3许可证

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM