短链系统设计
2025-04-29
主要实现几个需求:
- 点击短链接,自动跳转到长链接: http://hdcjh.xyz/whhcB
- 支持 A/B 测试
- 通过中间页面 prefetch 丝滑加载目标网页
- 用户可随时在后台配置短链
- 用 RabbitMQ Fanout 队列删除本地缓存
- 自动收集、分析用户数据
- 爬虫过滤
- 本地 Channel 大小 2000,批量插入用户行为数据,有损可控
- 使用 Redis ZSet 统计短链 PV 数据
短链算法
使用数据库主键(pk)一一映射到短链码(code),这个映射的过程使用的是FF3-1 保形加密算法。
- 为什么不使用雪花算法?
- 我们的短链长度只有 6 位,如果使用雪花算法,8 字节的数据 base62 编码后会达到 11 位,不符合要求。
- 去年全年的营销短信数量在 100 亿左右,其中用到短链的有 60 亿,而短信是以字数(每70字)计费的。
- 6 位短链对应的 int 类型大小为 5 字节,对于 5 字节的雪花算法来说,不如直接用 sequenceID,即数据库 PK。
创建短链
使用 Redis.INCR 维护数据库自增 ID。
当自增 ID 过期时,使用 RedLock 锁定创建流程,从数据库中拿最大的 ID 出来,写进 Redis 里,最后释放锁。
使用 Redis.INCR concurrentNums
合理平衡数据库 pk gap 和系统性能。用 atomic.AddInt
有一个问题是:
- 如果 Before 先请求,但 Current 获取并插入 Max ID2,并更新到了 Redis,此时 Before 才姗姗来迟地插入 DB,会报 Duplicate Key。
- 如果是 Duplicate Key,Before 则需要在 context Deadline 之前不断指数回退重试。
- 如果大量 After 请求在 Current 拿到 RedLock 后到来,则会导致大量请求阻塞,直到 Current 释放锁或者指数回退到 context Deadline。
请求示例:
POST https://api.knowuv.com/knowuv.UserInteractionService/CreateShortLink
x-request-id: 1xc2k60ep6d
authorization: Token a6815249f12feacc45ef2486a2dbee5b3cc88422
sec-ch-ua-platform: "macOS"
Referer: https://knowuv.com/
sec-ch-ua: "Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"
sec-ch-ua-mobile: ?0
connect-protocol-version: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Content-Type: application/json
{
"originUrl": "https://knowuv.com/blog/short-link",
"remark": "4/25/2025, 12:12:05 PM",
"type": 4,
"userId": "1"
}
响应示例:
{
"msg": "OK",
"data": {
"shortLinkCode": "fCxUP",
"originUrl": "https://knowuv.com/blog/short-link",
"originUrlMd5": "83f8764b3e03a7185983048887df6f994d69aa4c9e34a830d88bb045c72778c6",
"type": 4,
"remark": "4/25/2025, 12:15:58 PM",
"pv": 0,
"status": 0
},
"code": 0
}
支持 4000+ 同时访问。

访问短链
点击 hdcjh.xyz/mgex8 访问短链。
支持 2500+ 同时创建。

技术支持
- 您可直接发送邮件到 dusty-cjh@qq.com
Dev
- ShortLink SEO
- 添加 “题目反馈” 按钮在右上角
- Nuxt markdown链接自动添加访问来源 from={encoded_path}
- 退出后重新进入 sl 应该能过看到历史记录
- 短链 “复制” 按钮应该更加清晰 DONE
用户需求:
- 不想让人看到原始网址,所以用缩短网址来隐藏
- 例如微信群二维码 7 天有效,用短链接可以保证目标网址永久有效
- 发营销短信的时候附带短链,可以统计打开率,分析用户偏好
- 同一个短链可以随机跳转到不同的 A/B 源链接,用来测试同一渠道不同页面的转化率
用户触达:
- 谷歌搜索 “缩短网址”、“缩网址”
- 社交平台宣传,如知乎、小红书、牛客网、力扣网
页面设计: 不要跳转后台,不要介绍高级功能,容易让人发懵。
- 首页不要展示任何无用功能,只有粘贴原始链接、生成、复制、历史记录。(预计95%用户止步于此)
- 当用户往下滑动时,再介绍具体的高级功能。(预计千分之一)