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

Cassandra 2.1: how to model for the N most recently active users?

我需要使用 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 属性,因为它用作集群键。 我 可以 删除旧数据并在用户执行其他操作时创建新条目 - 但用户操作频繁发生,我们很快就会达到墓碑限制。

有谁知道我如何最好地建模数据才能实现这一目标?

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

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 时,将 day 减 1 并查询它。将 TTL 设置为 1 到 5 天或其他时间,旧记录将被压缩。这假设您在 24 小时内至少进行了 N 次操作,否则您可能会得到一个不完整的列表。如果您的记录非常活跃,可以使用 hour 而不是 day.

day/hour 组件可以只是一个简单的 floor(time() / (60*60*24))