4

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

我只有一个数据结构,一个键是字符串的映射。地图的对象是地图本身,但这次的值是简单的对象/原语,例如字符串、整数、双精度等。所以地图的地图。最内层映射的键是恒定的,即除了创建时,不会从最内层映射添加/删除任何条目。所以它有点像传统的表格,尽管每一行可能有任意列。

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

以下是我的要求:

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

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

我看过 Berkeley DB Java 版,但它在要求 #6 上失败了。我已经查看了 TokyoCabinet/KoyotoCabinet,但它在要求 #1 上失败了。

那么你会推荐什么?

4

4 回答 4

1

有几种选择,但neo4j似乎符合您的要求。 HBaseCassandra也是选项,但可能超出您的需要。

于 2013-01-30T15:37:15.990 回答
0

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

于 2013-03-06T16:06:39.503 回答
0

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

于 2013-01-31T23:30:32.250 回答
0

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

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