我正在尝试创建一个设计,其中多个 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有什么办法吗?我应该选择可以支持上述内容的不同数据库选择吗?我应该使用 Cassandra 并将计数器保存在 Redis 内存中并在第二步更新 Cassandra 吗?
最佳答案
可以读取计数器。您不能做的是在更新计数器时检索旧值。
你不能做的另一件事是在同一个表中放入计数器列和非计数器列(如果它不是主键的一部分)。
All non-counter columns in the table must be defined as part of the primary key
在您的示例中,counter_value
、threshold_value
和 status
不能在同一个表中。您必须将它们分派(dispatch)到两个表中:一个具有 counter_value
另一个具有 threshold_value
和 status
并且两个表具有相同的主键:url_name
.
关于concurrency - Cassandra 中的柜台设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39225893/