MST

星途 面试题库

面试题:Cassandra数据模型优化以应对超高并发

假设存在一个超高并发的社交平台点赞场景,每秒有上万次点赞操作。请详细说明如何利用Cassandra的数据模型进行优化,包括但不限于数据建模、索引设计、一致性级别调整等,以确保系统高效稳定运行。
40.7万 热度难度
数据库Cassandra

知识考点

AI 面试

面试题答案

一键面试

数据建模

  1. 确定核心查询:在点赞场景中,常见查询可能是获取某个帖子的点赞数,以及获取某个用户的点赞记录。
  2. 设计表结构
    • 按帖子统计点赞数
      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_timepost_id 作为聚类键,按点赞时间倒序排列,方便获取用户最近的点赞记录。

索引设计

  1. 二级索引:如果需要根据其他属性(如点赞的设备类型等)进行查询,可以考虑使用二级索引。例如:
    CREATE INDEX ON user_likes (device_type);
    
    但要注意,二级索引会增加写入开销,应谨慎使用。
  2. 物化视图:若有复杂查询需求,如获取某个时间段内所有点赞数超过一定阈值的帖子,可以创建物化视图。
    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);
    

一致性级别调整

  1. 写入操作:对于点赞操作,通常可以选择 ONEQUORUM 一致性级别。选择 ONE 可以获得最高的写入性能,因为只要有一个副本写入成功,写入操作就被认为成功。但如果对数据一致性要求较高,可选择 QUORUM,它要求超过半数的副本写入成功。例如:
    session.execute("UPDATE post_likes SET like_count = like_count + 1 WHERE post_id = %s", (post_id,), consistency_level = ConsistencyLevel.ONE)
    
  2. 读取操作:读取点赞数等数据时,也可根据需求调整一致性级别。若对实时性要求不高,可选择 ONE 以提高读取性能;若需要读取到最新数据,可选择 QUORUMALL。例如:
    rows = session.execute("SELECT like_count FROM post_likes WHERE post_id = %s", (post_id,), consistency_level = ConsistencyLevel.QUORUM)
    

其他优化

  1. 批量操作:将多个点赞操作批量提交,减少客户端与 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)
    
  2. 缓存:在应用层使用缓存(如 Redis),缓存热门帖子的点赞数等经常读取的数据,减少对 Cassandra 的读取压力。