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