我想在 cassandra 1.2 CQL 3.0 上实现一个实时内容排名系统
示例:根据用户投票提供新闻的前 10 条评论
- 用户可以评论新闻
- 用户可以对每条评论投票 +1 或 -1
内容可能有 100、1000、10k、100k 条评论
所以我需要的是根据投票分数获得实时(或延迟 5 分钟)前 10 条评论
[真实示例 youtube 评论]
我的解决方案是:
- 在计数器表上存储投票计数器 (content_counter)
- 创建排名表
创建表 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 的所有数据都存储在按分数 desc 排序的 1 行中
- 我只有我这个表评论至少有 1 票
那么当用户投票时会发生什么
- SELECT score FROM content_counter where content_id='x' (R: 123)
- UPDATE content_counter SET score=score+1 (124)(或-1)
批量:
- 删除 content_comment_rank WHERE content_id='x' AND score=123 AND com_id='y'
- 插入 content_comment_rank (content_id,score,com_id) 值 ('x',124,'y')
因此,拥有内容的前 10 条评论是
SELECT * FROM content_comment_rank WHERE content_id='x' LIMIT 10
这很容易,但我不确定我是否做得很好,因为:
如何处理复制和并发投票
也许通过每天批量更新 1 次(就像在视频 youtube 上的投票一样)
也许有更好的方法......
我们需要“计数器表上的集群排序”.....(全部在 1 个原子查询中完成)但不存在(或不存在......)
你对我的解决方案有什么建议?
谢谢,