题目
设计一个高并发短链接生成系统
信息
- 类型:问答
- 难度:⭐⭐
考点
系统架构设计,分布式ID生成,缓存策略,数据库优化
快速回答
设计高并发短链接系统的核心要点:
- 短码生成:使用分布式ID生成算法(如Snowflake)或Base62编码哈希值
- 键值存储:Redis缓存热点映射关系(短码→长URL),设置TTL过期策略
- 数据库设计:使用NoSQL(如Cassandra)存储映射关系,分片键设计为短码
- 重定向优化:HTTP 301永久重定向减少后端负载
- 防攻击措施:速率限制和布隆过滤器防恶意刷请求
1. 系统架构设计
核心组件:
- API网关:处理请求路由和限流
- 短码生成服务:分布式无状态服务
- 缓存层:Redis集群缓存热点数据
- 持久层:分片数据库存储映射关系
- 统计服务:异步处理点击统计

2. 短码生成原理
方案对比:
| 方法 | 优点 | 缺点 |
|---|---|---|
| 哈希算法(MD5/SHA) | 避免碰撞 | 需处理冲突(加盐) |
| 自增ID转Base62 | 无碰撞 | 需分布式ID生成器 |
| 预生成池 | 高性能 | 需维护空闲池 |
Base62示例代码:
const BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
function encode(num) {
if (num === 0) return BASE62[0];
let s = '';
while (num > 0) {
s = BASE62[num % 62] + s;
num = Math.floor(num / 62);
}
return s;
}
// 使用Snowflake生成分布式ID
const id = snowflake.nextId();
const shortCode = encode(id); // 输出如 "3a8Fj2"3. 存储与缓存设计
数据模型:
{
"short_code": "3a8Fj2",
"original_url": "https://long-domain.com/path?query=value",
"created_at": "2023-10-05T08:00:00Z",
"expire_at": "2024-01-01T00:00:00Z",
"user_id": "user123"
}读写策略:
- 写流程:生成短码 → 写数据库 → 写Redis
- 读流程:Redis查询 → 未命中则查DB → 回填缓存
- 缓存TTL:设置24小时过期,冷数据自动淘汰
4. 高并发优化
关键措施:
- 重定向:使用HTTP 301减少后续查询
- 缓存穿透:布隆过滤器拦截非法短码请求
- 分库分表:按短码首字母分片(如0-9,a-z,A-Z)
- 异步统计:Kafka队列解耦点击统计处理
5. 常见错误与解决方案
| 错误 | 解决方案 |
|---|---|
| 短码碰撞 | 重试机制+唯一索引 |
| 缓存击穿 | 互斥锁控制DB查询 |
| 短码猜测 | 增加长度(6→8字符) |
| DB热点 | 分片键加入随机前缀 |
6. 扩展知识
- 自定义短码:额外校验唯一性,限制特殊字符
- 时效控制:TTL自动删除过期链接
- 安全防护:过滤恶意URL(如钓鱼网站)
- 全球部署:使用CDN缓存重定向请求