gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:03:24 26 4
gpt4 key购买 nike

问题是针对有经验的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com