首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纪事地图-值数据类型

纪事地图-值数据类型
EN

Stack Overflow用户
提问于 2015-04-23 16:52:44
回答 1查看 983关注 0票数 0

在价值端是地图或集合的情况下,实现编年史地图的最佳方法是什么?

我需要类似于以下数据结构的数据结构,在这里我可以用一个特定的id存储多个版本的数据:

代码语言:javascript
复制
chronicle-map: String -> Map<String,V>
$id -> {v0-> value-v0, v1-> value-v1, v2 -> value-v2}

或者可能有两张地图:

代码语言:javascript
复制
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/set实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-17 21:01:38

  1. 当然,您应该切换到Chronicle 3.x,因为这个版本定义了新的、坚实的模式和抽象集,这些模式和抽象有时会演变成支持“原生”Multimap

以下是纪事地图3.x

  1. 为了确保原子性(线程安全),您可以:
代码语言:javascript
复制
- use Java 8's new Map methods: `compute()`, `computeIfAbsent()`, `computeIfPresent()` or `merge()` methods, like:

静态 void multiMapAdd(ChronicleMap map,K键,V值){ map.compute(key,(k,v) -> { if (v == null) v=新HashSet<>();v.add(值);返回v;};

-获取上下文,并使用值字节操作,以优化某些序列化/反序列化成本。例句:

接口LimitedSet {公共静态最终int MAX_VALUES_SIZE = 20;字节getSize();void setSize(字节);MyValue getValue(int索引);void setValue(@MaxSize(MAX_VALUES_SIZE) int索引,MyValue值);}.尝试(ExternalMapQueryContext cxt = map.queryContext(key) { cxt.writeLock().lock();MapEntry entry = cxt.entry();if (entry == null) { MapAbsentEntry absentEntry = cxt.absentEntry();cxt.insert(absentEntry,absentEntry.defaultValue();entry = cxt.entry();absentEntry != null;}cxt.writeLock值=());int size = values.getSize();for (int i= 0;i< size;i++) { if (相同(values.getValue(I),值))返回false;} if (size == MAX_VALUES_SIZE)抛出新IllegalStateException(“值集溢出”);values.set(大小、值);values.setSize(字节)(大小+1);

您还可以在纪事地图自述中找到几个这样的高级"MultiMap“用法,这些用法揭示了CRDT复制和多项锁定的额外功能:

代码语言:javascript
复制
    - [CRDT values for replicated Chronicle Maps -- Grow-only set](https://github.com/OpenHFT/Chronicle-Map#crdt-values-for-replicated-chronicle-maps----grow-only-set)
    - [Undirected graph](https://github.com/OpenHFT/Chronicle-Map#undirected-graph)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29829835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档