我知道这可能已经被问过无数次了,但我似乎无法为我的确切用例找到黄金解决方案。
我只有一个数据结构,一个键是字符串的映射。地图的对象是地图本身,但这次的值是简单的对象/原语,例如字符串、整数、双精度等。所以地图的地图。最内层映射的键是恒定的,即除了创建时,不会从最内层映射添加/删除任何条目。所以它有点像传统的表格,尽管每一行可能有任意列。
我需要这个数据结构是持久的和复制的。
以下是我的要求:
- 纯Java解决方案
- 磁盘映射仅在重新启动时使用。因此永远不会从磁盘读取任何内容,并且所有写入仅由一个应用程序完成)
- 嵌入式。
- 表现。重要的是现有记录的 UPDATE 性能。更新可能每秒发生 100k 次(但更可能是每秒 20-50k)。至于插入/删除,它们当然会发生,但每天可能只有几次。因此,我不太担心 INSERT/DELETE 性能。
- 复制。为了恢复弹性,我需要复制地图的磁盘副本。从 master 到 slave 的复制不需要是原始事务的一部分,即我可以牺牲一些 ACIDness 来换取性能。
- 记录数预计为 100k-200k,但不会高很多。每条记录的大小可能是 100-200 KB,所以总共没有那么多数据。我猜数据文件的总大小将低于 100 MB,这可能是偏高的估计。
- 数据总量不超过它始终可以容纳在内存中。(这就是为什么我可以保证不会有磁盘读取,除了在启动期间)
- 我的应用程序没有分发。在任何给定时间点,只有一个活动进程写入磁盘。
- 自由开源许可证。(Apache、BSD、LGPL,应该没问题)
所讨论的应用程序不需要存储上述数据结构之外的任何内容,即它不会有未来对其他持久性数据结构的未发现需求。因此,基于这种特定的数据结构进行优化听起来很公平。
我看过 Berkeley DB Java 版,但它在要求 #6 上失败了。我已经查看了 TokyoCabinet/KoyotoCabinet,但它在要求 #1 上失败了。
那么你会推荐什么?