
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) 【追问清单】
7) 【常见坑/雷区】