2016-08-30 145 views
0

我想创建一个设计,其中多个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?

回答

0

可以读取计数器。你不能做的是在更新计数器时检索旧值。

你不能做的另一件事是放置在同一个表计数器列和非计数器列(如果它不是主键的一部分)。

表中的所有非柜台列必须被定义作为主键

的一部分,在你的榜样,counter_valuethreshold_valuestatus不能在同一个表。您必须将它们分配到两个表中:一个与counter_value另一个与threshold_valuestatus并且两个表具有相同的主键:url_name

+0

感谢您的回复。更新计数器时是否有任何解决方法来读取旧值?还是应该在Cassandra之外使用一些额外的机制(如在Redis中保留相同的计数器)?你将表分成两份的建议是有效的。 – gliatsos