我想用特定的密钥将最新记录写入db。如果我有记录的时间戳,那将很容易。但我有记录的序列号而不是时间戳。
此外,序列号在达到较大值(2 ^ 16)后重置为0。但是,序列号可以随时重置,即使它没有达到2 ^ 16。
我可以选择附加所有记录并读取序列号最大的记录。但是复位后会出现问题(因为任何时候都可能发生复位)。
另一种选择是使用轻量级事务,但我不确定它是否能保证并发性。性能也可能受到很大影响。
我该怎么做呢?我正在使用Cassandra DB。
答案 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这样的外部锁定系统。在分布式系统中,这种事情会更复杂,并且您将永远无法获得与正常写入相同的吞吐量。