我想创建一个设计,其中多个C++服务将保持计数器在数据库中,类似如下:计数器设计卡桑德拉
CREATE TABLE page_view_counts
(url_name varchar,
counter_value counter,
threshold_value int,
status int,
PRIMARY_KEY (url_name)
);
我想使用Cassandra的,但我不知道,如果卡桑德拉能支持以下操作以原子的方式支持多个服务实例的并发:
READ counter_value
IF counter_value > threshold_value
SET status = 1 (BLOCKED)
ELSE
SET counter_value++
我见过卡桑德拉计数器(https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html) ,但它似乎不能支持读操作 - 它只是确保您可以增加计数器的某个值(不知道以前的状态)。
卡桑德拉有什么办法吗?我应该去选择一个可以支持上述的数据库吗?我应该使用Cassandra并将计数器保存在Redis内存中,并在第二步中更新Cassandra?
感谢您的回复。更新计数器时是否有任何解决方法来读取旧值?还是应该在Cassandra之外使用一些额外的机制(如在Redis中保留相同的计数器)?你将表分成两份的建议是有效的。 – gliatsos