concurrency - Cassandra 中的柜台设计

标签 concurrency cassandra redis hitcounter

我正在尝试创建一个设计,其中多个 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_valuethreshold_valuestatus 不能在同一个表中。您必须将它们分派(dispatch)到两个表中:一个具有 counter_value 另一个具有 threshold_valuestatus 并且两个表具有相同的主键:url_name.

关于concurrency - Cassandra 中的柜台设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39225893/

相关文章:

redis - 在 Redis 中处理不同数据集时的最佳实践是什么

multithreading - 如何理解静态一致性?

java - 多个线程可以看到 Java 中直接映射的 ByteBuffer 上的写入吗?

performance - Web 应用程序中的并发

select - Cassandra 错误 - 仅当分区键受 EQ 或 IN 限制时才支持 Order By

javascript - 使用 JavaScript 进行 Cucumber/Capybara 测试似乎不会只执行一项也使用 ActionCable 和 Redis 的测试

Docker 409 客户端错误。如何获取真实错误并查看容器中的真实日志?

objective-c - 在一个 NSOperationQueue 上抢占 NSOperation 并将 NSOperation 放置到一个单独的 NSOperationQueue 上?

cassandra的连接问题

cassandra - CQL:如何检查键空间是否存在?