1

我正在尝试创建一个设计,其中多个 C++ 服务将计数器保存在数据库中,如下所示:

CREATE TABLE page_view_counts
    (url_name varchar,
     counter_value counter,
     threshold_value int,
     status int,
    PRIMARY_KEY (url_name)
    );

我正在考虑使用 Cassandra,但我不确定 Cassandra 是否可以以原子方式支持以下操作以支持多个服务实例的并发:

READ counter_value
IF counter_value > threshold_value
  SET status = 1 (BLOCKED)
ELSE
  SET counter_value++

我见过 Cassandra 计数器(https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html)但它似乎不支持 READ 操作 - 它只是确保您可以增加计数器通过某个值(不知道以前的状态)。

卡桑德拉有什么办法吗?我应该选择可以支持上述内容的不同数据库吗?我应该使用 Cassandra 并将计数器保存在 Redis 内存中并在第二步中更新 Cassandra 吗?

4

1 回答 1

0

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

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

表中所有非计数器列必须定义为主键的一部分

在您的示例中counter_valuethreshold_valuestatus不能在同一个表中。您必须将它们分派到两个表中:一个与counter_value另一个与threshold_valueandstatus并且两个表具有相同的主键:url_name

于 2016-08-30T13:46:56.197 回答