短链接系统全流程设计详解:从原理到落地,一篇看懂!
大约 4 分钟
短链接系统全流程设计详解:从原理到落地,一篇看懂!
背景:什么是短链接?为什么要设计它?
在实际开发中,我们经常会遇到一些超长 URL,例如:
https://www.jd.com/special/activity/2024-07-13/ads/campaign?id=987654321&user=abc如果我们要把它放到微信、微博、短信、二维码、甚至名片上展示 —— 太长了!
因此诞生了短链接:
将一个长链接转换成一个结构简短、唯一可跳转的短网址,例如:
https://dl.x/abc123
短链接系统要解决哪些问题?
| 核心目标 | 解释 |
|---|---|
| 唯一性 | 相同长链接不能生成不同短码,避免重复跳转 |
| 高性能 | 高并发访问不能挂、响应必须快 |
| 高可用 | 系统稳定、支持缓存降级、容灾 |
| 可拓展性 | 支持设置失效时间、访问统计、批量生成 |
系统整体流程图(超详细)
+------------------------+
| 用户提交长链接 |
+----------+-------------+
|
v
+-----------------------------+
| 1. 检查是否已生成短码(缓存+DB) |
+-----------------------------+
| 有 | 无
v v
返回已有短码 +----------------------+
| 2. 生成新短码 |
+----------------------+
|
+-----------------------------------------+
| 3. 保存映射关系(短码 -> 长链接) |
+--------------------+--------------------+
|
v
返回完整短链接(如 dl.x/abc123)
↓
用户访问 dl.x/abc123 → 查询短码 → 拿到长链接 → 返回 302 重定向核心模块一:短码生成逻辑
方案一:哈希 + 62 进制编码(推荐)
原始链接 --> MD5/SHA1 哈希 --> 截取前 8 位 --> base62 编码 --> 短码例如:
String hash = MD5("https://xxx.com/page?id=123"); // 16进制
String shortCode = toBase62(hash.substring(0, 8)); // abc123优点
- 不依赖数据库自增 ID,可水平扩展
- 原链接相同,生成短码一致
缺点
- 哈希冲突概率虽小但存在(需做冲突检查)
方案二:自增 ID + base62 转换
数据库维护一个主键自增 ID:
id: 12345678 --> base62编码 --> gkT2s优点:无冲突、短码稳定 缺点:需中心化分发,分库分表时管理复杂
核心模块二:映射存储设计(MySQL + Redis)
表结构设计(MySQL)
CREATE TABLE short_link (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
short_code VARCHAR(10) UNIQUE,
long_url TEXT NOT NULL,
create_time DATETIME,
expire_time DATETIME
);Redis 设计(用于加速跳转)
SET short:abc123 "https://long-url.com/xxx"
EXPIRE short:abc123 30d核心模块三:短链跳转逻辑
当用户访问 https://dl.x/abc123,后端逻辑:
- 拿到路径短码
abc123 - 去 Redis 查找:
short:abc123 - 找不到?→ 去 MySQL 查表
- 找到对应长链接
https://jd.com/xxx - 返回 HTTP 302 跳转
HTTP/1.1 302 Found
Location: https://jd.com/xxx核心模块四:访问统计 & 分析
可通过日志系统或表记录访问次数:
CREATE TABLE access_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
short_code VARCHAR(10),
access_time DATETIME,
ip_address VARCHAR(45),
user_agent TEXT
);系统挑战与解决方案汇总
| 问题 | 解决方案 |
|---|---|
| 短码冲突 | 哈希 + 检查冲突,冲突后重试或加盐 |
| 高并发跳转性能瓶颈 | Redis 缓存,Nginx 预热,CDN 边缘重定向 |
| 热点短链被刷爆 | 加限流 + IP 黑名单,访问频控 |
| 数据失效 | 增加过期字段 expire_time,定期清理 |
| 批量生成短链 | 支持批量接口 + 后台任务分批插入 |
可拓展功能推荐(高级面试加分)
| 功能 | 实现方式 |
|---|---|
| 自定义短码 | 提供前端自定义输入,校验重复性 |
| 多平台跳转 | 配置字段:Android、iOS、PC 三个长链地址 |
| 权限控制 | 不登录不给生成,或添加验证码 |
| 活动链统计 | 聚合访问量、跳出率、转化率 |
| 防钓鱼验证 | 对访问人加 Referer / UA 检查 |
面试总结模板(开口即专业)
我们会先通过 MD5 + base62 编码生成短码,判断是否已存在缓存和 DB 中;不存在则插入映射关系,返回短链。短链访问时查 Redis → DB,返回 302 重定向。系统考虑并发、唯一性、失效等问题,还可以拓展自定义短码、访问分析、权限控制等功能。
最终总结一句话
短链系统的核心,是一个“高并发安全可控的映射重定向系统”。
不是简单哈希就完事了,而是:短码生成 + 存储映射 + 跳转服务 + 安全机制 + 拓展能力 = 系统完整性!
工程里的关键补充点
唯一性与冲突
- 哈希方案必须做冲突检测,冲突可加盐或延长码长
- 自增 ID 方案要考虑号段分配与中心化瓶颈
缓存与一致性
- Redis 与 DB 一致性要有兜底策略
- 热点短码要有本地缓存或多级缓存
访问安全
- 对访问频次做限流,防刷爆热点短链
- 可选加白名单或黑名单策略
失效与清理
- 过期短码要有定时清理任务
- 清理要避免误删活跃短码
