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

设计一个支持百万级用户并发注册和登录的用户系统,请从架构设计、数据存储、缓存策略、高可用方案等方面进行阐述。

9377游戏后端开发难度:困难

答案

1) 【一句话结论】采用微服务拆分(用户服务、认证服务)+ 分布式ID生成(Snowflake)+ 缓存分层(Redis读写缓存+本地缓存)+ 数据库读写分离+ 多机房主从复制,确保百万级并发下的性能与高可用。

2) 【原理/概念讲解】
首先讲微服务拆分:把用户注册登录拆成独立的“用户服务”(处理业务逻辑,如校验用户名、生成用户信息)和“认证服务”(处理鉴权逻辑,如生成Token、验证密码),通过API网关统一入口,降低服务耦合,提升扩展性。
接着讲分布式ID生成:使用Snowflake算法(由Twitter开源),通过时间戳、机器ID、序列号组合生成ID,保证全局唯一且有序,避免高并发下ID冲突(类比:像给每个用户发一张“唯一序号票”,无论多少用户同时操作,都能按时间顺序分配不重复的票)。
然后讲缓存策略:Redis作为读写缓存,存储高频访问数据(如用户信息、Token),减少数据库压力;本地缓存(如Java的ConcurrentHashMap)处理更频繁的访问(如用户登录后的Token验证),提升响应速度。
再讲数据库设计:采用“读写分离+分库分表”模式,主库负责写操作(如注册时写入用户数据),从库负责读操作(如登录时查询用户信息),按用户ID哈希分库(如id%1000=0到999对应不同库),按时间分表(如按月分表),应对数据量增长。
最后讲高可用方案:Redis用“哨兵模式”实现主从切换(主节点故障时自动切换到从节点);数据库采用“多机房主从复制”(如北京、上海机房,通过VPC连接,实现跨机房容灾),确保单点故障不影响业务。

3) 【对比与适用场景】

方案定义特性使用场景注意点
分布式ID生成(Snowflake)基于时间、机器ID、序列号的ID生成算法全局唯一、有序、低延迟用户注册、订单生成等需要全局唯一ID的场景需要协调中心或分布式方案,避免单点故障
缓存策略(Redis读写缓存)使用Redis存储高频访问数据,如用户信息、Token高速读写、支持数据过期、分布式减少数据库压力,提升并发性能需要设置合理的过期时间,避免缓存穿透/雪崩

4) 【示例】
用户发起注册请求(POST /api/user/register):

  • API网关路由到“用户服务”;
  • 用户服务调用Snowflake生成ID(如ID=1234567890123456789012345);
  • 向数据库主库写入用户信息(INSERT INTO users(id, username, password) VALUES(1234567890123456789012345, 'testuser', 'hashedpwd'));
  • 同时将用户信息写入Redis(SET user:1234567890123456789012345 3600 s {id:1234567890123456789012345, username:'testuser'});
  • 返回成功响应({"code":0, "msg":"注册成功"})。

登录流程类似:验证密码后生成Token(存储在Redis的token:testuser键中),返回Token给客户端。

5) 【面试口播版答案】
面试官好,针对百万级用户并发注册登录系统,我的设计思路是围绕架构拆分、分布式ID、缓存分层、数据库优化、高可用这几个核心点展开。首先,架构上采用微服务拆分,把用户注册登录拆成独立的用户服务和认证服务,通过API网关统一入口,降低服务耦合。然后,分布式ID生成用Snowflake算法,保证全局唯一且低延迟,避免ID冲突。缓存策略上,Redis作为读写缓存,存储用户信息、Token等高频数据,减少数据库压力;同时结合本地缓存处理高频访问。数据库层面,采用读写分离+分库分表,主库负责写,从库负责读,按用户ID哈希分库,按时间分表,应对数据量增长。高可用方面,Redis用哨兵模式实现主从切换,数据库采用多机房主从复制,确保跨机房容灾。这样整体方案能支撑百万级并发,同时保证性能和稳定性。

6) 【追问清单】

  • 问题1:分布式ID生成器如果出现故障,如何保证ID不冲突?
    回答要点:采用多节点部署,节点间通过协调中心同步状态,避免单点故障。
  • 问题2:缓存击穿/雪崩如何处理?
    回答要点:缓存设置过期时间(如TTL),并采用互斥锁或分布式锁防止热点key同时过期;Redis集群分片,避免单点雪崩。
  • 问题3:数据库分库分表的具体方案?
    回答要点:按用户ID哈希分库(如id%1000=0到999对应不同库),按时间分表(如按月分表),结合读写分离提升性能。
  • 问题4:高可用方案中,如何处理跨机房延迟?
    回答要点:通过VPC连接多机房,设置合理的延迟阈值,避免跨机房请求影响性能。
  • 问题5:注册时如果用户名已存在,如何快速响应?
    回答要点:在Redis中缓存用户名-用户ID映射,先查询Redis,若存在则快速返回错误,减少数据库查询。

7) 【常见坑/雷区】

  • 坑1:未考虑分布式ID冲突,直接用UUID,导致ID重复。
  • 坑2:缓存未设置过期时间,导致数据不一致。
  • 坑3:数据库未做读写分离,所有请求都打到主库,导致性能瓶颈。
  • 坑4:高可用方案只考虑单机房,未考虑多机房容灾。
  • 坑5:缓存与数据库数据不一致,未处理缓存穿透/雪崩。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1