如果我在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]结束,还是会使用最后一次写入获胜来达到微秒?
答案 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/