Cassandra 1.2 CQL 3.0にリアルタイムコンテンツランキングシステムを実装したい
例 : ユーザーの投票に基づいて、ニュースに関する上位 10 のコメントを提供する
- ユーザーはニュースにコメントできます
- ユーザーは各コメントに +1 または -1 を投票できます
コンテンツごとにおそらく100、1000、10k、100kのコメント
だから私が必要とするのは、投票スコアに基づいてトップ10のコメントをリアルタイム(または5分遅れ)で取得することです
【実例youtubeコメント】
私の解決策は次のとおりです。
- カウンター テーブル (content_counter) に投票カウンターを格納する
- ランク表を作る
create table content_comment_rank ( content_id timeuuid, score bigint, com_id timeuuid, PRIMARY KEY (content_id, score, com_id) ) WITH CLUSTERING ORDER BY (score DESC)
- content_id のすべてのデータは、score desc で並べられた 1 つの ROW に格納されます
- このテーブルのコメントには少なくとも 1 票が必要です
ユーザーが投票するとどうなるか
- SELECT スコア FROM content_counter where content_id='x' (R: 123)
- UPDATE content_counter SET スコア=スコア+1 (124) (または -1)
バッチで:
- 削除 content_comment_rank WHERE content_id='x' AND スコア=123 AND com_id='y'
- INSERT content_comment_rank (content_id,score,com_id) VALUES ('x',124,'y')
したがって、コンテンツの上位 10 件のコメントを持つことは、
SELECT * FROM content_comment_rank WHERE content_id='x' LIMIT 10
とても簡単ですが、うまくいっているかどうかはわかりません。理由は次のとおりです。
レプリケーションと同時投票の処理方法
たぶん、毎日1回バッチで更新することによって(ビデオyoutubeへの投票が機能しているようです)
もっといい方法があるかも……。
「カウンターテーブルでのクラスターの順序付け」が必要です.....(すべて1つのアトムクエリで実行されます)が、存在しません(または存在しません...)
私の解決策についてあなたのアドバイスは何ですか?
ありがとうございました、