问题描述
在选择 Java 数据结构时,我正在为写入密集型应用程序寻找各种替代方案。我知道 ONE 数据结构无法为写入密集型应用程序提供单一的通用解决方案,但我很惊讶没有关于该主题的讨论。
有很多人在谈论 read-intensive-rate-writes 或 concurrent-read-only 应用程序,但我找不到任何关于用于写入密集型应用程序的数据结构的讨论。
基于以下要求
- 键/值对 -
Map
- 未分类 - 为简单起见
- 每分钟 1000+ 次写入/读取量可忽略不计
- 所有数据都存储在内存中
我正在考虑以下方法
- 简单
ConcurrentHashMap
:虽然基于 Oracle 官方文档中的这个
[...] 即使所有操作都是线程安全的,检索操作也不需要锁定
它必须更适合读取密集型应用程序
- 一个
BlockingQueue
和一组ConcurrentHashMap
的组合。分批排空队列中的所有元素,然后在底层映射中适当分配更新。在这种方法中,虽然我需要一个额外的地图来确定每个地图包含哪些地图 - 就像一个协调器 - 使用
HashMap
并在 API 级别同步。这意味着每个写相关的方法都将被同步
synchronized void aWriteMethod(Integer aKey,String aValue) {
thisWriteIntensiveMap.put(aKey,aValue);
}
如果这个问题不仅会收到对上述选项的批评,还会收到关于新的更好解决方案的建议,那就太好了。
PS:除了数据的完整性、操作顺序和节流问题外,在选择写入密集型的“最佳”方法时还需要考虑什么。
我知道这可能看起来有点开放,但听听人们对这个问题的看法会很有趣。
解决方法
即使您会选择最糟糕的地图类型,例如同步 HashMap,我认为您不会注意到负载对性能有任何影响。每分钟几千次写入不算什么。
我会建立一个 JMH 基准测试并尝试各种地图实现。显而易见的候选者是 ConcurrentHashMap,因为它旨在处理并发访问。
所以我认为这是过早优化的一个很好的例子。