我有一个列家族帖子,用于存储我的facebook帐户的帖子详细信息。我使用的是cassandra 2.0.9和datastax java驱动程序3.0。
CREATE TABLE posts (
key blob,
column1 text,
value blob,
PRIMARY KEY ((key), column1)
) WITH COMPACT STORAGE;
其中rowkey是我的userid,columnkey是postid,value是post-json。每当我在浏览器中刷新我的应用程序时,它都会从facebook中获取数据,并删除和添加现有帖子的数据。有时我会错过卡桑德拉的一些帖子。频繁地在同一行的同一列中删除和插入是否会导致数据丢失?我该怎么办?
这并不是真正的数据丢失,如果您以非常高的频率(如每秒数千次更新)更新同一列,则可能会产生不可预测的结果。
为什么?因为Cassandra使用insert时间戳,通过比较不同副本中同一列的时间戳,在读取时确定哪个值是正确的。
目前,时间戳的分辨率是毫秒级的,所以如果更新率非常高,例如在同一列上更新2次,持续同一毫秒,则较大的后JSON将获胜。
更大,我指的是使用postJson1.compareTo(postJson2)
。排序由列的类型决定,在您的情况下,它是一个字符串,因此Cassandra通过字典式比较后JSON数据来打破平局。
为了避免这种情况,您可以在客户端通过为自己生成一个唯一的timmeuuid()来提供写时间戳。
有许多内部操作可以生成这样的TimeUUID,例如通过使用Java驱动程序类com.datastax.driver.core.utils.UUIDs.timeBased()