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))
我需要使用 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))