设计一个可靠 UDP
设计一个抢红包系统
如何拆包
- 随机数
- 线性切割
- 二倍均值法
核心业务接口
抢红包
发红包
- 落流水
- 更新账户余额
- 初始化红包到 Redis
设计一个秒杀系统
设计一个分布式 ID
设计一个微信步数系统
设计用户粉丝关注表
设计微博共同关注
设计数据库连接池
设计一个本地缓存
设计短链服务
2. 短链工作原理
^35a4
- 短链接实质是一个短URL重定向服务
- 用户访问短链时,服务器返回302状态码和原始长链接
- 浏览器接收后自动跳转到原始长链接地址
- 该过程对用户无感知,体验上相当于直接访问原链接
流程示意图
复制
MermaidOpen SVG
3. 设计考量
3.1 请求量对齐策略
^e32e
- 需要根据QPS选择合理的中间件
- 若访问短链的QPS仅有2k,单台SSD的MySQL完全可以满足需求
- 大流量场景考虑使用MySQL集群 + Redis加速
3.2 容量对齐策略
^6a43
- 短链容量估算直接决定字符串长度
- 字符越长,可存储的短链数量越多
3.3 设计对齐方案
^bba4
-
Long URL和Short URL关系设计
- 一个Short URL只能对应一个Long URL
- 一个Long URL可以对应多个Short URL,节省空间
-
短链有效期设计
- 考虑用户长期收藏需求,某些场景短链不应失效
- 可根据业务需求设置不同的过期时间
3.4 服务设计
^4e32
- 短链系统只需一个服务节点(URLService)
- 核心方法:
- encode: 将长链编码成短链
- decode: 通过短链获取长链
API设计
| HTTP方法 | 路径 | 请求体数据 | 响应 |
|---|---|---|---|
| GET | short_url | null | 状态码: 301/302, 原始长链 |
| POST | shorten | long_url | short_url |
3.5 存储设计
^a5b1
SQL方案
sql
复制
CREATE TABLE `url_map` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`long_url` varchar(160) DEFAULT NULL COMMENT '长链',
`short_url` varchar(10) DEFAULT NULL COMMENT '短链',
INDEX idx_long_url (long_url),
INDEX idx_short_url (short_url),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 需要在short_url和long_url分别建立索引
- 用short_url找long_url,用long_url找short_url都需高效
NoSQL方案
也可考虑使用NoSQL数据库,特别是对高并发有更好的支持
4. 短链生成算法
^3ba2
4.1 算法1: 使用哈希函数
- 优点: 速度快
- 缺点: 难以设计一个没有冲突的Hash算法
4.2 算法2: 自增ID + 数据库记录
- 优点: 实现简单
- 缺点: 生成的短链长度会随着记录增多而变长
4.3 算法3: Base62编码
- 62个字符 = 10个数字(0-9) + 52个字母(a-z, A-Z)
- 6位可表示62^6 = 570亿条记录(5位=9亿)
- 每个短链对应一个整数ID,映射到数据库主键
Base62编码优势
- 效率高
- 不依赖于具体URL内容,可自定义ID分配
5. 分布式ID生成方案
^b5a1
- 雪花算法
- Zookeeper序列生成
- Redis自增
- UUID
- 数据库自增字段
6. 性能优化策略
^7e4a
6.1 缓存优化
- 存储两组键值对:
- Long URL → Short URL
- Short URL → Long URL
6.2 地理位置优化
- 使用CDN将数据分发到离用户近的服务器
6.3 服务器响应优化
- 不同地区使用不同Web服务器
- 通过DNS解析将用户引导到最近的服务器
7. 水平扩展方案
^c2d1
短链服务适合水平扩展:
- 使用ID/ShortUrl作Sharding Key
- Long URL到Short URL的查询只能广播给所有数据库
- 使用Long URL作Sharding Key
- Short URL到Long URL的查询需要广播给所有数据库
8. 全局唯一ID生成方案
^a4e3
方案1: 专用ID数据库
- 该数据库不存储实际数据,仅负责生成自增ID
方案2: 使用Zookeeper生成
- 利用Zookeeper的分布式协调能力生成唯一ID
