Java持久化键值存储

4
我知道这可能已经被问了无数次,但我似乎找不到适合我确切用例的黄金解决方案。
我只有一个数据结构,一个键为字符串的映射。映射对象本身也是映射,但这次值是简单的对象/基元,例如字符串、整数、双精度等。所以是一张映射表。最内层映射的键是常量,即最内层映射中没有条目会被添加或删除,除非在创建时。因此它有点像传统的表格,尽管每行可能具有任意列。
我需要这个数据结构是持久的和复制的。
以下是我的要求:
  1. 纯Java解决方案
  2. 磁盘映射仅在重新启动时使用。因此,从来没有从磁盘读取任何内容,所有写入都只由一个应用程序完成)
  3. 嵌入式。
  4. 性能。重要的是现有记录的更新性能。更新将潜在地每秒发生100k次(但更可能是20-50k次)。至于插入/删除,当然会发生,但可能只有几次每天。因此,我不太担心插入/删除性能。
  5. 复制。为了韧性,我需要将映射的磁盘副本复制。从主服务器到从服务器的复制不需要是原始事务的一部分,即我可以为了性能而牺牲一些ACID性。
  6. 记录数预计为100k-200k,但不会更高。每个记录的大小可能是100-200 KBytes,因此总数据量并不是很大。我猜数据文件的总大小将低于100 MBytes,这可能是一个高估。
  7. 数据总量不超过内存容量。(这就是为什么我可以保证没有磁盘读取,除了启动期间)
  8. 我的应用程序不是分布式的。在任何给定时间点,只有一个活动进程写入磁盘。
  9. 自由开源许可证。(Apache、BSD、LGPL,应该都可以)
涉及的应用程序永远不需要存储除上述数据结构之外的任何内容,即它将来不会有其他持久性数据结构的未覆盖需求。因此,根据这个特定的数据结构进行优化听起来是合理的。
我看过Berkeley DB Java版,但它不能满足第6个要求。我看过TokyoCabinet/KyotoCabinet,但它不能满足第1个要求。
那么你会推荐什么呢?

我使用 ehcache - OldCurmudgeon
1
Ehcache磁盘缓存的复制不需要企业版吗?(因此它违反了要求#9)。还是我误解了? - peterh
你说得很对,我漏掉了那个要求。 - OldCurmudgeon
你看过Hazelcast吗? - moodywoody
4个回答

1

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


1
谢谢。我的错,我以前从未听说过neo4j。如果我需要复制,我不需要企业许可证吗?(因此违反了我的第9个要求)。注意:我只是简单地浏览了他们的网站。 - peterh

0

你看过Redis吗?它是一个内存中的“数据库”(键值存储),在我看来,它完全符合你的需求。


Redis如何与上述的请求1或请求3协作? - peterh
非常抱歉 - 我以为你是在寻找Java解决方案...错过了纯Java的方法。Redis有一个Java库,但我猜那不是你想要的。 - Suman

0

0

看看 HazelCast。它满足你大部分的需求,只是它是分布式的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接