gpt4 book ai didi

java - 编年史 map - 值数据类型

转载 作者:行者123 更新时间:2023-12-01 11:37:22 24 4
gpt4 key购买 nike

实现值(value)侧为 map 或集合的编年史 map 的最佳方式是什么?

我需要类似于以下的数据结构,我可以在其中存储具有特定 ID 的某些数据的多个版本:

chronicle-map: String -> Map<String,V>
$id -> {v0-> value-v0, v1-> value-v1, v2 -> value-v2}

或者可能有两张 map :

chronicle-map-1: String -> Set<String>
key-$id -> Set{v0,v1,v2}

chronicle-map-2: String -> V
version-$id-v0 -> value-v0
version-$id-v1 -> value-v1
version-$id-v2 -> value-v2

(原子性和序列化性能是我主要关心的问题)。 acquireUsingLocked/getUsingLocked 方法似乎不适用于标准 map /集合实现。

最佳答案

  1. 您当然应该做的事情是切换到 Chronicle Map 3.x,因为该版本定义了新的、可靠的模式和抽象集,有时会发展为支持“原生”Multimap .

[以下内容涉及 Chronicle Map 3.x]

  • 为了确保原子性(线程安全),您可以:

    • 使用 Java 8 的新 Map 方法:compute()computeIfAbsent()computeIfPresent()merge () 方法,例如:

      static <K, V> void multiMapAdd(ChronicleMap<K, Set<V>> map, K key, V value) {
      map.compute(key, (k, v) -> {
      if (v == null)
      v = new HashSet<>();
      v.add(value);
      return v;
      });
      }
    • 获取上下文,并使用值字节进行操作,可能是为了优化一些序列化/反序列化成本。例如

      interface LimitedSet {
      public static final int MAX_VALUES_SIZE = 20;

      byte getSize();
      void setSize(byte);

      MyValue getValue(int index);
      void setValue(@MaxSize(MAX_VALUES_SIZE) int index, MyValue value);
      }

      ...
      try (ExternalMapQueryContext<K, LimitedSet, ?> cxt = map.queryContext(key) {
      cxt.writeLock().lock();
      MapEntry<K, LimitedSet> entry = cxt.entry();
      if (entry == null) {
      MapAbsentEntry<K, LimitedSet> absentEntry = cxt.absentEntry();
      cxt.insert(absentEntry, absentEntry.defaultValue());
      entry = cxt.entry();
      assert entry != null;
      }
      LimitedSet values = entry.value().get();
      int size = values.getSize();
      for (int i = 0; i < size; i++) {
      if (same(values.getValue(i), value))
      return false;
      }
      if (size == MAX_VALUES_SIZE)
      throw new IllegalStateException("values set overflow");
      values.set(size, value);
      values.setSize((byte) (size + 1));
      }

      您还可以在 Chronicle Map 自述文件中找到 Chronicle Map 的一些此类高级“MultiMap”用法,它们揭示了 CRDT 复制和多条目锁定等附加功能:

  • 关于java - 编年史 map - 值数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29829835/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com