51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

游戏用户数据(如角色信息、装备、成就)通常存储在数据库中,请设计一个数据库表结构,并说明如何实现读写分离、分库分表,以及如何保证数据的一致性和可用性。

Tencent软件开发-游戏客户端开发方向难度:困难

答案

1) 【一句话结论】
游戏用户数据存储需通过主键自增按库分配(适配分库分表)、主从读写分离(从库延迟<1秒)、分库分表(哈希分库+时间分表)、分布式事务(Saga+幂等补偿)实现高可用与数据一致性。

2) 【原理/概念讲解】
先讲主键设计:自增ID按库分配(比如分库后库1自增从1开始,库2从10000001开始),避免UUID随机分片导致的热点问题,适合分库分表场景。接着读写分离:主库负责写操作,从库通过binlog异步复制数据,读请求路由至从库,提升读性能,但需控制从库延迟(比如通过监控工具实时检查延迟,延迟超过1秒时触发告警或切换读库)。再讲分库分表:分库按业务维度(如用户ID哈希分库,8个库),分表按时间维度(如按年月分表,2024_01),分片规则直接影响数据扩展性和查询性能。最后数据一致性:读写分离采用最终一致性,写后读可能存在延迟,通过Redis缓存热点数据(如用户角色信息,TTL设为5分钟,淘汰策略LRU);分库分表用Saga模式(分步骤操作+补偿),比如装备升级先更新装备表,再更新角色表,失败时回滚(补偿步骤需幂等,通过唯一标识避免重复操作)。

3) 【对比与适用场景】

方向定义核心目标适用场景注意点
读写分离主库写,从库读提升读性能读多写少(如角色信息查询)写操作同步到从库,延迟问题
分库分表水平/垂直拆分数据库扩展数据量数据量巨大(千万级用户)主键设计复杂,跨库查询困难
Saga模式分布式事务补偿链保证一致性分库分表下的跨库操作补偿步骤需幂等,避免重复操作

4) 【示例】

  • 表结构设计(伪代码):
    -- 用户表(主库,自增ID按库分配)
    CREATE TABLE user (
        user_id BIGINT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(50) NOT NULL,
        password_hash VARCHAR(255) NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    
    -- 角色表(分库分表:按user_id % 8哈希分库,按year_month分表)
    CREATE TABLE role (
        role_id BIGINT PRIMARY KEY,
        user_id BIGINT NOT NULL,
        level INT NOT NULL,
        exp INT NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (user_id) REFERENCES user(user_id)
    );
    
    -- 装备表(垂直分表,从角色表中拆分)
    CREATE TABLE equip (
        equip_id BIGINT PRIMARY KEY,
        role_id BIGINT NOT NULL,
        equip_name VARCHAR(100) NOT NULL,
        equip_level INT NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (role_id) REFERENCES role(role_id)
    );
    
  • 读写分离架构:主库(MySQL Master)配置binlog,从库(MySQL Slave)通过slave_start复制数据,读请求通过Nginx+Keepalived路由至从库,延迟监控(如延迟<1秒)。
  • 分库分表实现:ShardingSphere配置分片规则(如按user_id % 8分库,按year_month分表)。
  • 跨库查询优化:聚合查询(如查询用户所有装备)通过ShardingSphere聚合查询(延迟控制,设置超时时间避免长时间等待),Redis缓存聚合结果(TTL=5分钟,LRU淘汰)。
  • Saga模式示例(装备升级):
    步骤1:更新装备表(增加装备等级,事务ID=1);
    步骤2:更新角色表(增加经验值,事务ID=2);
    失败时:检查补偿步骤是否已执行(通过唯一补偿标识),若未执行,执行补偿(降级装备等级,减少经验值),补偿步骤幂等(通过唯一标识避免重复补偿)。

5) 【面试口播版答案】
“面试官您好,针对游戏用户数据存储,我设计表结构如下:用户表存储基础信息,角色表和装备表通过外键关联,同时考虑分库分表。首先,表结构设计上,用户表(user_id为主键,自增ID按库分配)、角色表(user_id关联用户,按月份分表)、装备表(垂直分表,减少角色冗余)。然后读写分离,主库写,从库读,通过binlog复制,用Nginx+Keepalived路由读请求,提升读性能,并监控从库延迟(延迟<1秒)。分库分表方面,按用户ID哈希分库(如8个库),按月份分表(如2024_01),用ShardingSphere实现,解决数据量增长问题。数据一致性方面,读写分离采用最终一致性,写后读可能延迟,通过Redis缓存热点数据(如用户角色信息);分库分表用Saga模式保证一致性,比如装备升级时,先更新装备表,再更新角色表,失败时回滚(补偿步骤幂等,通过唯一标识避免重复操作)。这样既保证高可用,又提升性能。”

6) 【追问清单】

  • 问题1:读写分离中,从库数据延迟如何控制?
    回答要点:通过异步复制+延迟监控(如延迟<1秒),延迟超阈值时自动切换读库,或缓存预热(Redis预热热点数据)。
  • 问题2:分库分表后,跨库查询(如查询用户所有装备)如何优化?
    回答要点:通过ShardingSphere聚合查询(延迟控制,设置超时时间),或Redis缓存聚合结果(TTL=5分钟,LRU淘汰)。
  • 问题3:Saga模式中,补偿步骤如何保证幂等性?
    回答要点:通过唯一补偿标识(如事务ID+时间戳),检查补偿步骤是否已执行,避免重复操作。
  • 问题4:游戏场景下,如何应对数据库主库宕机?
    回答要点:主从切换(Keepalived自动切换至从库),或主主复制+读写分离,提升可用性。

7) 【常见坑/雷区】

  • 坑1:读写分离时,未控制从库延迟,导致读数据不一致。
  • 坑2:分库分表时,主键设计不合理(如UUID),导致分片热点问题。
  • 坑3:Saga模式补偿步骤未幂等,导致失败时重复补偿,数据不一致。
  • 坑4:分库分表后,跨库查询未优化,导致性能下降。
  • 坑5:未说明从库延迟超过阈值时的容错机制,降低方案可信度。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1