问题是针对经验丰富的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天后,这些记录将毫无用处。
感谢。
答案 0 :(得分:2)
正如您所发现的,Cassandra不支持Counter列上的TTL。实际上,Cassandra中的计数器删除通常是有问题的(一旦删除计数器,你基本上不能重复使用它一段时间。)
如果您需要自动过期,可以使用int字段对其进行建模,也可以使用外部锁定(例如zookeeper),请求路由(仅允许一个编写器访问特定分区),或轻量级事务以安全地增加带TTL的整数字段。
或者,您可以翻阅计数器表并删除&#34; old&#34;在计划任务上使用DELETE手动计数。这不太优雅,也不会扩展,但在某些情况下可能会起作用。