使用Cassandra中的计数器进行数据建模,使列到期

时间:2015-04-10 15:02:18

标签: 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做一些垃圾收集器?这是一个好方法吗?
  • 也许我需要为此使用其他数据模型?它可能是什么?

感谢。

1 个答案:

答案 0 :(得分:2)

正如您所发现的,Cassandra不支持Counter列上的TTL。实际上,Cassandra中的计数器删除通常是有问题的(一旦删除计数器,你基本上不能重复使用它一段时间。)

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

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