面试题答案
一键面试数据建模
- 确定核心查询:在点赞场景中,常见查询可能是获取某个帖子的点赞数,以及获取某个用户的点赞记录。
- 设计表结构:
- 按帖子统计点赞数:
这里使用CREATE TABLE post_likes ( post_id UUID, like_count counter, PRIMARY KEY (post_id) );
counter
类型来高效地对点赞数进行原子性递增操作。post_id
作为主键,使得对特定帖子点赞数的查询和更新都非常高效。 - 获取用户点赞记录:
以CREATE TABLE user_likes ( user_id UUID, post_id UUID, like_time timestamp, PRIMARY KEY ((user_id), like_time, post_id) ) WITH CLUSTERING ORDER BY (like_time DESC);
user_id
作为分区键,保证同一个用户的点赞记录在同一个分区内。like_time
和post_id
作为聚类键,按点赞时间倒序排列,方便获取用户最近的点赞记录。
- 按帖子统计点赞数:
索引设计
- 二级索引:如果需要根据其他属性(如点赞的设备类型等)进行查询,可以考虑使用二级索引。例如:
但要注意,二级索引会增加写入开销,应谨慎使用。CREATE INDEX ON user_likes (device_type);
- 物化视图:若有复杂查询需求,如获取某个时间段内所有点赞数超过一定阈值的帖子,可以创建物化视图。
CREATE MATERIALIZED VIEW popular_posts AS SELECT post_id, like_count FROM post_likes WHERE like_count > 100 AND like_time > '2023 - 01 - 01 00:00:00' PRIMARY KEY (like_count, post_id);
一致性级别调整
- 写入操作:对于点赞操作,通常可以选择
ONE
或QUORUM
一致性级别。选择ONE
可以获得最高的写入性能,因为只要有一个副本写入成功,写入操作就被认为成功。但如果对数据一致性要求较高,可选择QUORUM
,它要求超过半数的副本写入成功。例如:session.execute("UPDATE post_likes SET like_count = like_count + 1 WHERE post_id = %s", (post_id,), consistency_level = ConsistencyLevel.ONE)
- 读取操作:读取点赞数等数据时,也可根据需求调整一致性级别。若对实时性要求不高,可选择
ONE
以提高读取性能;若需要读取到最新数据,可选择QUORUM
或ALL
。例如:rows = session.execute("SELECT like_count FROM post_likes WHERE post_id = %s", (post_id,), consistency_level = ConsistencyLevel.QUORUM)
其他优化
- 批量操作:将多个点赞操作批量提交,减少客户端与 Cassandra 节点的交互次数,提高整体性能。例如在 Python 中使用
BatchStatement
:batch = BatchStatement() for post_id in post_ids_to_like: batch.add("UPDATE post_likes SET like_count = like_count + 1 WHERE post_id = %s", (post_id,)) session.execute(batch)
- 缓存:在应用层使用缓存(如 Redis),缓存热门帖子的点赞数等经常读取的数据,减少对 Cassandra 的读取压力。