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