微博的短链接 t.cn/xxxx 怎么做的?从哈希算法到分布式 ID,一个完整的短链系统设计。

一、短链系统的核心流程

  • 1.1 长链 → 短链(生成)
  • 1.2 短链 → 长链(查询)→ 302 跳转
  • 1.3 核心指标——短链长度、碰撞率、跳转延迟

二、短链生成——哈希算法

  • 2.1 MD5 生成 128 位哈希 → 取前 N 位 → Base62 编码
  • 2.2 哈希碰撞问题——不同 URL 可能生成相同短链
  • 2.3 解决碰撞——追加随机串后重新哈希(再哈希法)
  • 2.4 MurmurHash——比 MD5 更快

三、短链生成——自增 ID

  • 3.1 自增 ID → Base62 编码
  • 3.2 优点——无碰撞、递增
  • 3.3 缺点——可遍历(安全风险)、依赖发号器
  • 3.4 分布式发号器——雪花算法

四、Base62 编码

  • 4.1 字符集——[0-9a-zA-Z],62 个字符
  • 4.2 编码实现——10 进制 → 62 进制
  • 4.3 7 位 Base62 可表示 62^7 ≈ 3.5 万亿

五、存储方案

  • 5.1 短链 → 长链的 KV 存储——Redis
  • 5.2 持久化——MySQL
  • 5.3 缓存策略——LRU 淘汰
  • 5.4 布隆过滤器——缓存穿透保护

六、302 vs 301

  • 6.1 302 临时重定向——每次来都走服务端,方便统计
  • 6.2 301 永久重定向——浏览器缓存,减少请求但无法统计

七、高并发设计

  • 7.1 CDN 缓存短链
  • 7.2 Redis Cluster 存储映射关系
  • 7.3 本地缓存 Caffeine——热点短链

八、总结

  • 短链系统 = 发号器 + Base62 + KV 存储 + 302
  • 设计权衡——唯一性 vs 性能 vs 可读性