database - 在 Cassandra 中使用计数器进行数据建模,过期列

标签 database cassandra data-modeling cql

问题是针对有经验的 Cassandra 开发人员的。 我需要计算每个用户访问某些资源的次数和时间。 我有这样的数据结构(CQL):

CREATE TABLE IF NOT EXISTS access_counter_table (
  access_number counter,
  resource_id varchar,
  user_id varchar,
  dateutc varchar,
  PRIMARY KEY (user_id, dateutc, resource_id)
);

我需要获取有关用户在过去 N 天内访问资源的次数的信息。所以,为了得到最后 7 天,我提出这样的请求:

SELECT * FROM access_counter_table
  WHERE
    user_id = 'user_1'
    AND dateutc > '2015-04-03'
    AND dateutc <= '2015-04-10' ;

我得到这样的结果:

user_1 : 2015-04-10 : [resource1:1, resource2:4]
user_1 : 2015-04-09 : [resource1:3]
user_1 : 2015-04-08 : [resource1:1, resource3:2]
...

所以,我的问题是:旧数据必须在一段时间后删除,但是Cassandra 不允许设置 EXPIRE TTL 到计数器表

我每小时有数百万次访问事件(可能有数十亿次)。 7 天后,这些记录将毫无用处。

  • 我怎样才能清除它们?或者在 Cassandra 中制作类似垃圾收集器的东西?这是一个好方法吗?
  • 也许我需要为此使用其他数据模型?可能是什么?

谢谢。

最佳答案

如您所见,Cassandra 不支持计数器列上的 TTL。事实上,在 Cassandra 中删除计数器通常是有问题的(一旦你删除了一个计数器,你基本上暂时无法重用它)。

如果您需要自动过期,您可以使用一个 int 字段对其进行建模,并且可能使用外部锁定(例如 zookeeper)、请求路由(只允许一个写入者访问特定分区)或轻量级事务来安全地增加它带有 TTL 的整数字段。

或者,您可以翻阅计数器表并在计划任务中使用 DELETE 手动删除“旧”计数器。这不太优雅,也不能扩展,但在某些情况下可能会起作用。

关于database - 在 Cassandra 中使用计数器进行数据建模,过期列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29564744/

相关文章:

database - 从 Swift 连接到 Postgres

count - Cassandra - 即使 CONSISTENCY LEVEL 设置为 ALL 或 QUORUM,cqlsh 也会返回不一致的结果

cassandra - 如何使用 pycassa 指定主键?

python - 如何有效结合类设计和矩阵数学?

sql - 数据建模草稿/报价/订单/发票

php - 警告 : mysql_connect(): php_network_getaddresses: getaddrinfo failed: No such host is known

database - postgresql execParams paramTypes 是什么意思?

cassandra - Cassandra CQL 中的 Where 和 Order By 条款

java - Hibernate:如何建模继承类型结构并在没有显式转换的情况下执行操作

database - 如何仅在一个事务中禁用 PostgreSQL 触发器?