Cassandra 2.1: как смоделировать для N самых последних активных пользователей?
Мне нужно получить список из 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 ответ
Вам не нужно удалять отдельные ячейки. Просто продолжай добавлять. Добавьте еще один компонент к ключу раздела, чтобы он не стал слишком широким:
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, уменьшите день на 1 и запросите это тоже. Установите TTL от 1 до 5 дней или около того, и старые записи будут сжаты. Это предполагает, что у вас есть как минимум N действий в течение 24 часов, иначе вы можете получить не полный список. Если ваши записи очень активны, можете использовать hour
вместо дня.
Компонент день / час может быть просто floor(time() / (60*60*24))