Java 持久键值存储

问题描述 投票:0回答:5

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

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

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

这是我的要求:

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

所讨论的应用程序不需要存储除上述数据结构之外的任何内容,即,它将来不会需要其他持久数据结构。因此,基于这种特定的数据结构进行优化听起来很公平。

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

那么你会推荐什么?

java cassandra hbase key-value-store
5个回答
1
投票

有几个选项,但neo4j似乎符合你想要的。 HBaseCassandra 也是选项,但超出您可能需要的范围。


0
投票

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


0
投票

看看

HazelCast
。它满足您的大部分要求,除了它是分布式的。


0
投票

我认为编年史地图非常适合您的情况

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

0
投票

我建议

  1. 亚硝酸盐数据库。使用起来非常容易和简单,功能丰富,快速,键值存储(不是纯Java)
  2. Java对象序列化:使用包含映射的对象来存储所有内容并在退出时将其序列化为文件。在启动时反序列化它。
  3. 杰克逊连载。类似于2。比Java序列化快得多,纯文本输出但产生更大的文件。

.

© www.soinside.com 2019 - 2024. All rights reserved.