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