2016-12-16 4 views
2

cassandraを使用して、最新のアクションを持つN人のユーザーのリストを取得する必要があります。これでユーザーが最初にログインするには、新しいエントリを作成するときCassandra 2.1: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プロパティはクラスタリングキーとして使用されているため、更新できません。 I 古いデータを削除し、ユーザーが別の操作を実行したときに新しいエントリを作成しますが、ユーザーの操作が頻繁に発生し、すぐに墓石の限界に達するでしょう。

誰でも、これを達成するためにデータをモデル化する方法を知っていますか?

答えて

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でないときは、1日ごとにデクリメントして、それも照会します。 TTLを1〜5日に設定するか、古いレコードが圧縮されます。これは、24時間以内に少なくともN回のアクションがあることを前提としています。そうでない場合は、完全なリストではない可能性があります。あなたのレコードがスーパーアクティブな場合は、日の代わりにhourを使用できます。

日/時間のコンポーネントは、単純なfloor(time()/(60*60*24))

+0

おかげでクリスすることができます - 私は先に行って、これを実装しました。しかし、1つの問題がありますが、クエリはdupesを返します。私のアプリケーションでこれらの重複を除外することはできますが、これらのダストを作成しない方法があるかどうかは疑問でした。 – cscan

+0

フィルタリングはおそらく最も簡単なオプションです。その場合は、おそらくクエリからLIMITを削除する必要があります。ドライバのフェッチ制限は、パーティションのページングを処理します。しかし、それは悪いケースのシナリオを悪化させる可能性があります。あなたは潜在的に:((partition_key、day)、username) 'を実行することができます。これは、各ユーザーの最後のaction_timeを保存し、それを繰り返しながらトップNを維持します。私はそれが悪化すると予想しますが、それは本当にいくつのユーザーがアクティブであるかに依存します。 1日に多くのアクティブなユーザーしかいない場合、元のモデルは他のものより多く歩く必要があります –

関連する問題