2017-10-16 90 views
0

我想用特定键将最新记录写入数据库。如果我有记录的时间戳,这很容易。但我有记录的序列号而不是时间戳。在不使用时间戳的情况下写入最新数据

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

我可以选择追加所有记录并读取序列号最大的记录。但是它会在复位后导致问题(因为复位可能随时发生)。

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

我该如何去做这件事。我正在使用Cassandra DB。

回答

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;其中桶是“今天”,以防止分区变得太大。您必须在每个主机使用timeuuid时每ms写入10k次,然后才需要担心冲突。

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

相关问题