在价值端是地图或集合的情况下,实现编年史地图的最佳方法是什么?
我需要类似于以下数据结构的数据结构,在这里我可以用一个特定的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方法似乎不适用于标准的map/set实现。
发布于 2015-08-17 21:01:38
Multimap。以下是纪事地图3.x
- 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复制和多项锁定的额外功能:
- [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)
https://stackoverflow.com/questions/29829835
复制相似问题