Java持久键值存储

时间:2013-01-30 15:20:31

标签: java cassandra hbase key-value-store

我知道之前可能已经被问了几十次,但我似乎无法找到确切用例的黄金解决方案。

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

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

以下是我的要求:

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

    我看过伯克利数据库Java版,但它在第6项要求上失败了。我看过TokyoCabinet / KoyotoCabinet,但它没有按照要求#1。

    那么你会推荐什么?

4 个答案:

答案 0 :(得分:1)

有几个选项,但neo4j似乎符合您的要求。 <{3}}和HBase也是选项,但超出了您的需求。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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