用于写入密集型应用程序的 Java 并发收集 - 只有少量读取

问题描述

在选择 Java 数据结构时,我正在为写入密集型应用程序寻找各种替代方案。我知道 ONE 数据结构无法为写入密集型应用程序提供单一的通用解决方案,但我很惊讶没有关于该主题的讨论。

有很多人在谈论 read-intensive-rate-writesconcurrent-read-only 应用程序,但我找不到任何关于用于写入密集型应用程序的数据结构的讨论。

基于以下要求

  1. 键/值对 - Map
  2. 分类 - 为简单起见
  3. 每分钟 1000+ 次写入/读取量可忽略不计
  4. 所有数据都存储在内存中

我正在考虑以下方法

  1. 简单ConcurrentHashMap:虽然基于 Oracle 官方文档中的这个

[...] 即使所有操作都是线程安全的,检索操作也不需要锁定

它必须更适合读取密集型应用程序

  1. 一个 BlockingQueue 和一组 ConcurrentHashMap 的组合。分批排空队列中的所有元素,然后在底层映射中适当分配更新。在这方法中,虽然我需要一个额外的地图来确定每个地图包含哪些地图 - 就像一个协调器
  2. 使用 HashMap 并在 API 级别同步。这意味着每个写相关的方法都将被同步
synchronized void aWriteMethod(Integer aKey,String aValue) {
   thisWriteIntensiveMap.put(aKey,aValue);
}

如果这个问题不仅会收到对上述选项的批评,还会收到关于新的更好解决方案的建议,那就太好了。

PS:除了数据的完整性、操作顺序和节流问题外,在选择写入密集型的“最佳”方法时还需要考虑什么。

我知道这可能看起来有点开放,但听听人们对这个问题的看法会很有趣。

解决方法

即使您会选择最糟糕的地图类型,例如同步 HashMap,我认为您不会注意到负载对性能有任何影响。每分钟几千次写入不算什么。

我会建立一个 JMH 基准测试并尝试各种地图实现。显而易见的候选者是 ConcurrentHashMap,因为它旨在处理并发访问。

所以我认为这是过早优化的一个很好的例子。