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

在《梦幻西游》的用户系统中,如何设计用户数据表以支持数亿级用户,包括用户信息、角色数据、装备等,涉及分库分表、读写分离、缓存策略(Redis),以及数据一致性(如用户登录状态同步),请说明具体方案。

多益网络程序类难度:中等

答案

1) 【一句话结论】针对数亿级用户,采用分库分表(水平拆分用户ID哈希到多库,时间维度分表)+读写分离(主从复制)+Redis缓存(热点数据)的架构,通过分布式ID生成、消息队列保证数据一致性(最终一致性及延迟处理)。

2) 【原理/概念讲解】分库分表是水平扩展核心。水平分表:按用户ID哈希到不同数据库,每个库再按时间(如年份)分表,避免单库数据量过大;垂直分表:拆分用户表为用户基础表(核心信息,如ID、账号、密码)和用户扩展表(非核心,如社交、偏好),减少单表字段,提升查询。读写分离:主库写(如注册、登录),从库读(如查询用户信息),通过数据库复制,提升读性能。Redis缓存:将用户信息、角色、装备等热点数据缓存,减少数据库压力。数据一致性:登录状态同步时,用户登录后,状态(如在线、会话ID)写入Redis,并发布消息到消息队列,消费者更新其他节点,处理延迟。

3) 【对比与适用场景】
分库分表分片方式对比:

分片方式定义特性使用场景注意点
哈希分片按用户ID哈希到不同库/表数据均匀分布,查询需路由服务用户ID分布均匀,需全局唯一ID跨库操作复杂,需路由服务支持
范围分片按用户ID范围(如注册时间)分库/表数据按范围分布,查询需判断范围用户ID有规律(如按时间注册)需维护范围,可能数据倾斜

读写分离架构对比:

架构定义特性使用场景注意点
主从复制主库写,从库读读性能提升,主库压力减小读多写少(如查询用户信息)需要同步延迟,写操作需保证主库唯一

4) 【示例】
假设用户表(user_info)按用户ID哈希到库1-16,每个库分表(如user_info_2023);角色表(role_data)按注册时间范围分表(如注册时间1-1000万到库1的表1,1000-2000万到库1的表2);装备表(equipment)按ID哈希分表。Redis缓存用户信息(key: user:info:uid, value:用户数据)、角色(key: role:info:uid)、装备(key: equip:info:equip_id)。登录流程:客户端请求登录,服务端查Redis(user:info:uid),若存在验证密码;否则从主库查(库1的user_info_2023表),验证后缓存到Redis,返回成功。修改装备:先更新数据库,删除Redis缓存(写时更新),读取时若缓存失效,从数据库读并更新缓存(读时回源)。登录状态同步:用户登录后,将状态写入Redis,发布消息到RocketMQ,消费者更新其他节点缓存,超时重试。

5) 【面试口播版答案】
针对数亿级用户,我们设计用户系统时,核心是分库分表、读写分离和Redis缓存。分库分表方面,用户表按用户ID哈希到16个库,每个库按年份分表(如user_info_2023);角色表按注册时间范围分表(每千万用户一个表);装备表按ID哈希分表。读写分离用主从复制,主库写,从库读。Redis缓存用户信息、角色、装备等热点数据。数据一致性方面,登录状态同步用Redis缓存,用户登录后发布消息到消息队列,消费者更新其他节点,处理延迟。缓存一致性用写时更新和读时回源,确保数据一致。

6) 【追问清单】

  1. 问:分库分表的具体分片策略,比如用户ID如何哈希?范围分片如何划分?
    回答:用户ID用一致性哈希(如Snowflake+哈希),分配到16个库,每个库100个分片;角色表按注册时间每千万用户一个表(如1-1000万在库1的表1,1000-2000万在库1的表2)。
  2. 问:缓存一致性如何保证?比如用户修改装备后,缓存如何更新?
    回答:采用写时更新(数据库更新后删除Redis缓存)和读时回源(缓存失效后从数据库读取并更新缓存),同时通过消息队列发布更新消息,消费者更新缓存。
  3. 问:数据一致性,比如用户登录状态同步,如果网络延迟怎么办?
    回答:使用消息队列异步处理,设置超时重试机制,避免同步延迟导致状态不一致,属于最终一致性。
  4. 问:跨库操作如何处理?比如查询用户角色时,需要从不同库取数据?
    回答:通过路由服务(如ShardingSphere)自动路由到对应库,或合并查询(适用于小表,但需考虑性能)。

7) 【常见坑/雷区】

  1. 分库分表导致数据倾斜,如哈希分片导致部分库负载过高,需用虚拟节点(一致性哈希)平衡。
  2. 缓存击穿:热点数据缓存失效时,大量请求打到数据库,需设置热点数据预热或分布式限流。
  3. 数据一致性:若用同步方式同步登录状态,可能导致延迟,需权衡一致性和性能,采用最终一致性。
  4. 读写分离时,从库数据延迟,导致读数据不一致,需考虑延迟时间(如5秒内)。
  5. 分布式事务处理,跨库操作需用最终一致性,避免两阶段提交的高成本。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1