Know Your Wisdom

短链系统设计

2025-04-29

短链系统架构

主要实现几个需求:

  1. 点击短链接,自动跳转到长链接: http://hdcjh.xyz/whhcB
    • 支持 A/B 测试
    • 通过中间页面 prefetch 丝滑加载目标网页
  2. 用户可随时在后台配置短链
    • 用 RabbitMQ Fanout 队列删除本地缓存
  3. 自动收集、分析用户数据
    • 爬虫过滤
    • 本地 Channel 大小 2000,批量插入用户行为数据,有损可控
    • 使用 Redis ZSet 统计短链 PV 数据

短链算法

使用数据库主键(pk)一一映射到短链码(code),这个映射的过程使用的是FF3-1 保形加密算法

  • 为什么不使用雪花算法?
  1. 我们的短链长度只有 6 位,如果使用雪花算法,8 字节的数据 base62 编码后会达到 11 位,不符合要求。
  2. 去年全年的营销短信数量在 100 亿左右,其中用到短链的有 60 亿,而短信是以字数(每70字)计费的。
  3. 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+ 同时访问。

Visit API 压测结果
Visit API 压测结果

访问短链

访问短链时序图
访问短链时序图

点击 hdcjh.xyz/mgex8 访问短链。

支持 2500+ 同时创建。

Create API 压测结果
Create API 压测结果

技术支持

Dev

  • ShortLink SEO
  • 添加 “题目反馈” 按钮在右上角
  • Nuxt markdown链接自动添加访问来源 from={encoded_path}
  • 退出后重新进入 sl 应该能过看到历史记录
  • 短链 “复制” 按钮应该更加清晰 DONE

用户需求:

  1. 不想让人看到原始网址,所以用缩短网址来隐藏
  2. 例如微信群二维码 7 天有效,用短链接可以保证目标网址永久有效
  3. 发营销短信的时候附带短链,可以统计打开率,分析用户偏好
  4. 同一个短链可以随机跳转到不同的 A/B 源链接,用来测试同一渠道不同页面的转化率

用户触达:

  1. 谷歌搜索 “缩短网址”、“缩网址”
  2. 社交平台宣传,如知乎、小红书、牛客网、力扣网

页面设计: 不要跳转后台,不要介绍高级功能,容易让人发懵。

  1. 首页不要展示任何无用功能,只有粘贴原始链接、生成、复制、历史记录。(预计95%用户止步于此)
  2. 当用户往下滑动时,再介绍具体的高级功能。(预计千分之一)