这是官方文件。
All writes are sequential, which is the primary reason that writes perform so well in
Cassandra. No reads or seeks of any kind are required for writing a value to Cassandra
because all writes are append operations.
我感到困惑,因为如果有插入操作和重复的主键情况,cassandra将首先要求memtable或者如果数据被刷新到sstable。
因此,如果已经存在值为123的用户id并且我们正在使用123插入行,则它会失败,因为内部它会根据该键读取。如果有人可以澄清,这就是我的疑问。
答案 0 :(得分:2)
Cassandra中没有重复键的概念。写入Cassandra的每个更改都有一个时间戳,Cassandra会执行时间戳解析,这意味着具有最新时间戳的数据总是会获胜并返回。在读取路径中,如果存在,则来自SSTable的密钥的内容与memtable中的相同密钥的内容合并,并返回具有最新时间戳的数据。每列都有时间戳是没有价值的。
例如:
我们假设您在时间139106495223456写下以下内容:
123 => {column1:foo column1_timstamp:139106495223456}
然后在几微秒(139106495223470)后写入相同的密钥:
123 => {column1:bar column1_timstamp:139106495223470}
两项行动都将成功。当您尝试读取kay时,将返回具有column1:bar的那个,因为它具有最新的时间戳。
现在你可能想知道这对删除有什么作用。删除以相同的方式写入,除了正在删除的列/键将使用逻辑删除标记。如果逻辑删除具有laster时间戳,则该行或列将被视为已删除。
您可能想知道这对于磁盘的顺序写入是如何起作用的,因为这些逻辑删除或旧列会占用空间。是真的。这就是压缩存在的原因,它负责压缩和删除过期的tomstones。
您可以在此处阅读有关Cassandra写/读路径的更多信息:
http://www.planetcassandra.org/blog/category/Cassandra%20read%20path http://www.datastax.com/docs/1.1/dml/about_writes