Cassandra列表类型冲突

时间:2017-04-26 21:53:09

标签: cassandra

如果我在Cassandra有一个List字段并且有两个人同时写入它,那么它是一个简单的最后一次写入获胜还是它会合并写入?

例如:[a,b,c,d]
用户1 - > [b,a,c,d](将b移至索引0)
User2 - > [a,b,d,c](将c移至指数3)

Cassandra会合并结果并以[b,a,d,c]结束,还是会使用最后一次写入获胜来达到微秒?

1 个答案:

答案 0 :(得分:2)

您将获得合并结果

每个写入cassandra的数据,也会插入与每列相关联的时间戳。当您执行读取查询时,时间戳用于选择"获胜"在单个列或集合元素中更新。

如果我使用相同的时间戳进行真正的并发写怎么办?在不太可能的情况下,你最终会得到两个匹配微秒的时间戳,你最终可能会得到一个糟糕的版本,但Cassandra通过比较字节值来确保关系始终被打破。

Cassandra商店列表(集合)与普通列不同。
示例:

CREATE TABLE friendlists (
    user text PRIMARY KEY,
    friends list <text>
);

如果我们插入一些虚拟数据:

 user     | friends
----------+-------------------------
     john | [doug, patricia, scott]
 patricia |         [john, lucifer]

内部代表:

RowKey: john
=> (column=, value=, timestamp=1374687324950000)
=> (column=friends:26017c10f48711e2801fdf9895e5d0f8, value='doug', timestamp=1374687206993000)
=> (column=friends:26017c11f48711e2801fdf9895e5d0f8, value='patricia', timestamp=1374687206993000)
=> (column=friends:26017c12f48711e2801fdf9895e5d0f8, value='scott', timestamp=1374687206993000)
=> (column=friends:6c504b60f48711e2801fdf9895e5d0f8, value='matt', timestamp=1374687324950000)
=> (column=friends:6c504b61f48711e2801fdf9895e5d0f8, value='eric', timestamp=1374687324950000)
-------------------
RowKey: patricia
=> (column=, value=, timestamp=1374687352290000)
=> (column=friends:3b817b80f48711e2801fdf9895e5d0f8, value='john', timestamp=1374687243064000)

这里内部列名称更复杂,因为UUID被附加到CQL字段的名称&#34; friends&#34;。这用于跟踪列表中项目的顺序。

每次使用以下查询插入数据cassandra时:

INSERT INTO friendlists (user , friends ) VALUES ( 'patricia', ['john', 'lucifer']);
//or
UPDATE friendlists SET friends = ['john', 'lucifer']  where user =  'patricia';

将创建一个时间戳比当前时间更少的逻辑删除,它告诉先前的数据已被删除。因此,如果并发插入发生时具有相同的确切时间戳,则两个数据都在逻辑删除之前,因此两个数据都将存在。

资料来源:
http://mighty-titan.blogspot.com/2012/06/understanding-cassandras-consistency.html http://opensourceconnections.com/blog/2013/07/24/understanding-how-cql3-maps-to-cassandras-internal-data-structure-sets-lists-and-maps/