Organized 50 interview questions into 12 categories: - 01-分布式系统 (9 files): 分布式事务, 分布式锁, 一致性哈希, CAP理论, etc. - 02-数据库 (2 files): MySQL索引优化, MyBatis核心原理 - 03-缓存 (5 files): Redis数据结构, 缓存问题, LRU算法, etc. - 04-消息队列 (1 file): RocketMQ/Kafka - 05-并发编程 (4 files): 线程池, 设计模式, 限流策略, etc. - 06-JVM (1 file): JVM和垃圾回收 - 07-系统设计 (8 files): 秒杀系统, 短链接, IM, Feed流, etc. - 08-算法与数据结构 (4 files): B+树, 红黑树, 跳表, 时间轮 - 09-网络与安全 (3 files): TCP/IP, 加密安全, 性能优化 - 10-中间件 (4 files): Spring Boot, Nacos, Dubbo, Nginx - 11-运维 (4 files): Kubernetes, CI/CD, Docker, 可观测性 - 12-面试技巧 (1 file): 面试技巧和职业规划 All files renamed to Chinese for better accessibility and organized into categorized folders for easier navigation. Generated with [Claude Code](https://claude.com/claude-code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
12 KiB
12 KiB
秒杀系统设计
需求分析和数据量评估
需求分析
- 核心功能:商品秒杀、库存管理、下单支付、用户限流
- 业务场景:双十一、618等大促活动,商品短时间内高并发抢购
- QPS评估:假设10万用户同时抢购,QPS可达10万+
- 峰值预期:高峰期QPS可达50万+
- 数据规模:商品10万+,用户1000万+,订单日峰值1亿+
数据量评估
- 商品表:10万条,日均查询100万次
- 库存表:10万条,秒杀期间读写10万+/秒
- 订单表:日峰值1亿条,历史数据10亿+
- 用户表:1000万条,日均查询500万次
- Redis缓存:商品信息100万条,库存信息10万条
核心技术难点
1. 高并发库存管理
- 传统数据库锁无法支撑高并发
- 需要分布式锁配合缓存实现
- 库存扣减的原子性问题
2. 超卖问题
- 库存与订单不一致
- 需要最终一致性保证
- 重复下单处理
3. 限流策略
- 全局限流、用户限流、商品限流
- 限流算法选择(令牌桶、漏桶)
- 限流后的用户体验
4. 数据一致性
- 缓存与数据库的一致性
- 分布式事务处理
- 幂等性保证
系统架构设计
总体架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ CDN/Static │ │ Load Balance │ │ API Gateway │
│ Cache │◄──►│ (Nginx) │◄──►│ (Gateway) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
┌───────────────────────────────────┼───────────────────────────────────┐
│ │ │
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 业务服务 │ │ 业务服务 │ │ 业务服务 │
│ (微服务) │ │ (微服务) │ │ (微服务) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────────────────┼───────────────────────────────────┘
│
┌───────────────────────────────────┼───────────────────────────────────┐
│ │ │
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Redis集群 │ │ 消息队列 │ │ 数据库集群 │
│ (缓存+分布式锁)│ │ (Kafka/RocketMQ)│ │ (MySQL分库分表)│
└─────────────────┘ └─────────────────┘ └─────────────────┘
关键组件
1. 流量层
- CDN:静态资源加速
- Web服务器:Nginx负载均衡
- API网关:限流、路由、认证
2. 服务层
- 秒杀服务:核心业务逻辑
- 订单服务:订单处理
- 库存服务:库存管理
- 支付服务:支付处理
3. 存储层
- Redis集群:缓存和分布式锁
- 数据库集群:MySQL分库分表
- 消息队列:异步处理
4. 监控层
- 监控系统:实时监控
- 告警系统:异常告警
- 日志系统:业务日志
数据库设计
商品表
CREATE TABLE `seckill_product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`product_id` bigint NOT NULL COMMENT '商品ID',
`product_name` varchar(255) NOT NULL COMMENT '商品名称',
`product_desc` text COMMENT '商品描述',
`original_price` decimal(10,2) NOT NULL COMMENT '原价',
`seckill_price` decimal(10,2) NOT NULL COMMENT '秒杀价',
`stock_count` int NOT NULL COMMENT '库存数量',
`seckill_count` int NOT NULL DEFAULT 0 COMMENT '已秒杀数量',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_product_id` (`product_id`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
订单表
CREATE TABLE `seckill_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(64) NOT NULL COMMENT '订单号',
`user_id` bigint NOT NULL COMMENT '用户ID',
`product_id` bigint NOT NULL COMMENT '商品ID',
`product_name` varchar(255) NOT NULL COMMENT '商品名称',
`seckill_price` decimal(10,2) NOT NULL COMMENT '秒杀价',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
用户表
CREATE TABLE `seckill_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`email` varchar(100) NOT NULL COMMENT '邮箱',
`phone` varchar(20) NOT NULL COMMENT '手机号',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
缓存策略
Redis缓存设计
// 商品信息缓存
const PRODUCT_CACHE_PREFIX = 'product:';
const PRODUCT_CACHE_TTL = 3600; // 1小时
// 库存缓存
const STOCK_CACHE_PREFIX = 'stock:';
const STOCK_CACHE_TTL = 300; // 5分钟
// 分布式锁
const LOCK_PREFIX = 'lock:';
const LOCK_TTL = 10; // 10秒
// 用户限流
const RATE_LIMIT_PREFIX = 'rate_limit:';
const RATE_LIMIT_TTL = 1; // 1秒
缓存策略
-
多级缓存:
- CDN缓存静态资源
- Redis缓存热点数据
- 本地缓存减少网络IO
-
缓存更新策略:
- 主动更新:秒杀开始前预加载
- 异步更新:异步刷新数据库
- 失效策略:设置合理的TTL
-
缓存预热:
- 秒杀开始前加载商品信息
- 预热库存信息到Redis
- 预加载热门商品
分布式锁实现
public boolean acquireDistributedLock(String lockKey, String requestId, long expireTime) {
String result = redisTemplate.opsForValue().set(
lockKey,
requestId,
expireTime,
TimeUnit.MILLISECONDS
);
return "OK".equals(result);
}
public boolean releaseDistributedLock(String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
"return redis.call('del', KEYS[1]) " +
"else " +
"return 0 " +
"end";
Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class),
Collections.singletonList(lockKey),
requestId);
return result != null && result > 0;
}
扩展性考虑
1. 水平扩展
- 无状态服务:服务实例可以水平扩展
- 数据分片:按商品ID分片
- 读写分离:主库写入,从库读取
2. 垂直扩展
- 服务拆分:按业务域拆分微服务
- 数据分层:热数据、温数据、冷数据分离
- 缓存层扩展:Redis集群扩容
3. 异步处理
- 消息队列:订单处理异步化
- 事件驱动:使用事件总线
- 最终一致性:保证数据最终一致
4. 容灾备份
- 多活架构:多机房部署
- 故障转移:自动故障检测和转移
- 数据备份:定时备份和实时同步
实际项目经验
1. 技术栈选择
- 前端:Vue.js + React
- 后端:Spring Boot + Node.js
- 数据库:MySQL + Redis
- 缓存:Redis Cluster
- 消息队列:Kafka
- 监控:Prometheus + Grafana
2. 性能优化
- JVM调优:调整堆大小和GC策略
- MySQL优化:索引优化、慢SQL优化
- Redis优化:集群扩容、内存优化
- 网络优化:连接池配置、超时设置
3. 运维部署
- 容器化:Docker + Kubernetes
- CI/CD:Jenkins + GitLab
- 监控告警:ELK Stack + AlertManager
- 压测工具:JMeter + Locust
4. 灰度发布
- 蓝绿部署:无缝切换
- 金丝雀发布:逐步放量
- 流量控制:按比例分配流量
阿里P7加分项
1. 架构设计能力
- 高可用架构:设计99.99%可用性的系统
- 高性能架构:支持百万级QPS
- 高扩展架构:支持弹性扩缩容
2. 技术深度
- 分布式事务:Seata、TCC、Saga
- 分布式缓存:Redis集群、一致性哈希
- 分布式锁:Redis、Zookeeper、Etcd
3. 业务理解
- 电商业务:理解秒杀业务场景
- 用户行为:分析用户抢购习惯
- 风控系统:防刷、防作弊机制
4. 团队管理
- 技术团队:带领10人+技术团队
- 项目管控:管理千万级用户项目
- 技术方案评审:评审核心技术方案
5. 前沿技术
- Serverless:秒杀函数化
- 云原生:K8s微服务架构
- AI应用:智能推荐、风控
面试常见问题
1. 秒杀系统如何防止超卖?
- 使用Redis预减库存
- 分布式锁控制并发
- 数据库唯一约束
- 消息队列异步处理
2. 如何实现限流策略?
- 令牌桶算法
- 漏桶算法
- Redis计数器
- Nginx限流模块
3. 分布式锁的实现方式?
- Redis RedLock
- Zookeeper
- Etcd
- 数据库悲观锁
4. 如何保证数据一致性?
- 最终一致性
- 消息队列补偿
- 定时任务对账
- 幂等性设计
5. 秒杀系统的瓶颈在哪里?
- 库存查询
- 下单逻辑
- 支付处理
- 库存同步