当前位置: 首页 > 知识库问答 >
问题:

编年史映射-值数据类型

慕翰学
2023-03-14

什么是实现历史地图的最佳方式,其中值侧是地图或集合?

我需要类似于以下内容的数据结构,我可以使用特定id存储某些数据的多个版本:

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

或者可能有两张地图:

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方法似乎不适用于标准映射/集实现。

共有1个答案

颜志业
2023-03-14
  1. 你当然应该切换到编年史地图3。x、 因为这个版本定义了一组新的、坚实的模式和抽象,有时会演变为支持“本机”Multimap

[以下内容涉及编年史地图3.x]

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

>

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;
    });
}

获取上下文,并使用值字节进行操作,以优化某些序列化/反序列化成本。e. g.

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));
}

你也可以找到这样的先进"MultiMap"使用纪事地图,揭示了额外的能力,如CRDT复制和多条目锁定,在纪事地图自述:

  • 复制的历史记录地图的CRDT值--仅增长集
  • 无向图
 类似资料:
  • 我通常使用创建新的编年史映射,如下所示: 历史记录映射是否支持不同值类实例的存储,如果支持,如何构建该映射?

  • 我得到以下错误 JDBC 类型的无方言映射:2003 年;嵌套的异常是组织Hibernate映射异常:JDBC 类型没有方言映射:2 回购代码如下 DTO 对象如下所示 我们使用 Postgres DB,实际上在获取 值时存在一些问题。 Stackoverflow中的其他答案是特定于Hibernate的。但我们使用。

  • 通过阅读文档,我了解到对于键,我可以使用值类型ShortValue并重用该接口实现的实例。关于值,我找到了一个讨论DataAccess和SizedReader的页面,它给出了byte[]的示例,但我不确定如何将其适应长[]。我有一个额外的要求是,我需要在长数组中的任意索引处获取和设置值,而不需要每次对整个值进行完整的序列化/反序列化。 所以我的问题是:在构造映射时,我如何建模值类型,如果每个映射的

  • 我正在尝试添加一条消息到amazon aws sqs中的队列 所以我试了一下 它给了我这个错误 我猜是地图类型的,怎么能把这个参数以地图格式发送