Cassandra 2.1:如何为N个最近活跃的用户建模?

时间:2016-12-16 01:48:09

标签: cassandra cassandra-2.1

我需要使用cassandra获取N个用户的列表以及最近的操作。

我尝试使用以下架构:

CREATE TABLE user_actions(
  partition_key int, 
  username int,
  action_time timestamp,
PRIMARY KEY(partition_key, action_time)
WITH CLUSTERING ORDER BY(action_time DESC);

当用户首次登录时,会创建一个新条目。但是,我无法更新start_time属性,因为它用作群集密钥。 我可以删除旧数据并在用户采取其他操作时创建新条目 - 但用户操作经常发生,我们将很快达到逻辑删除限制。

有没有人知道如何最好地建模数据以实现这一目标?

1 个答案:

答案 0 :(得分:4)

您不需要删除单个单元格。继续追加。将另一个组件添加到分区键以防止变得太宽:

PRIMARY KEY((partition_key, day), action_time)

然后使用(伪代码):

之类的东西进行查询
y = floor(time() / (60 * 60 * 24))
oldest_possible = y - 7
r = []
while len(r) < N and y >= oldest_possible:
    R.append(query('SELECT * FROM user_actions where partition_key = {x} AND day = {y} LIMIT {N};', x, y, N)
    y -= 1

获取最后N个用户。当分区中的N不是N时,每天减1并查询。将TTL设置为1到5天或其他东西,旧记录将被压缩。这假设您在24小时内至少有N个动作,否则您可能会得到一个不完整的列表。如果您的记录处于超级活动状态,则可以使用hour代替日期。

日/小时组件可以是简单的floor(time() / (60*60*24))