不使用时间戳写入最新数据

时间:2017-10-16 11:38:54

标签: database concurrency cassandra transactions locking

我想用特定的密钥将最新记录写入db。如果我有记录的时间戳,那将很容易。但我有记录的序列号而不是时间戳。

此外,序列号在达到较大值(2 ^ 16)后重置为0。但是,序列号可以随时重置,即使它没有达到2 ^ 16。

我可以选择附加所有记录并读取序列号最大的记录。但是复位后会出现问题(因为任何时候都可能发生复位)。

另一种选择是使用轻量级事务,但我不确定它是否能保证并发性。性能也可能受到很大影响。

我该怎么做呢?我正在使用Cassandra DB。

1 个答案:

答案 0 :(得分:0)

对于最新值,通常通过保留事件日志并读取其中的第一条记录来完成。插入时,您始终可以生成新的时间戳(或timeuuid)。类似的东西:

CREATE TABLE record (
  id text,
  bucket text,
  created timeuuid,
  info blob,
  PRIMARY KEY ((id, bucket), created)
) WITH CLUSTERING ORDER BY (created DESC)

然后SELECT * FROM record WHERE id = 'user1' AND bucket = '2017-09-10' LIMIT 1;其中bucket为“今天”以防止分区变得太大。在您不得不担心冲突之前,每个主机每ms有10k次写入timeuuid。

如果您具有可线性化的一致性要求,那么您将需要使用paxos(轻量级事务,如果使用得当,它将保证它)或者像zookeeper这样的外部锁定系统。在分布式系统中,这种事情会更复杂,并且您将永远无法获得与正常写入相同的吞吐量。