/tinyurl

A high performance short-url generation service / 一个高性能的短链生成服务

Primary LanguageJavaGNU General Public License v3.0GPL-3.0

Tiny Url Design / 短链系统设计

短链原理

短链是基于 HTTP 的 301/302 状态码进行工作的;即浏览器通过短链访问短链服务,短链服务通过短链得知真实长链,以重定向的方式返回真实地址给浏览器,浏览器接收到重定向状态码,便对真实地址进行重定向访问,从而达到通过短链访问长链地址的作用

  • 301 永久重定向
    • 用户请求短链,短链系统返回长链地址,并告知 301 状态码。浏览器获得真实长链后,缓存起来,下次用户再次请求,就直接去缓存获取,而不再走短链系统了
  • 302 临时重定向
    • 用户请求短链,短链系统返回长链地址,并告知 302 状态码。浏览器得知是临时重定向,所以之后每次请求都再次向短链服务获取真实地址

301 和 302 可以根据具体的业务场景进行选择。比如我们需要进行活动数据分析,那么建议使用 302 状态码,这样可以获得到更为真实的活动数据

短链组成

  • http://snailmann.link/a/IW10D
    • 短链域名 http://snailmann.link/a/
    • 短链 key IW10D

第二部分的短链 key 则是我们需要重点设计的部分,即我们如何为每一个短链生成一个唯一的 key

短链算法

哈希算法

哈希算法需要解决几个问题

  • 哈希冲突如何解决?
  • 哈希冲突时存在并发问题,如何解决并发性能?
  • 哈希值因为均匀分布,导致大部分哈希值过大,短链过长,如何压缩?

自增序列算法

  • 自增序列算法理论上,不会出现冲突问题,可以很好的避免了哈希冲突
  • 但是自增序列也导致了无法从原始链接直接查询短链, 需要新的映射表来辅助查询

短链服务需求

需求

  • 支持写入长链,返回短链给用户
  • 当用户访问短链,服务应该 redirect 到长链地址
  • 短链需要有默认的过期时间,支持用户注册时,控制过期时间
  • 服务需要高可用,保证服务可用率 > 99.9%
  • 读请求时延尽可能低

考量因素

  • 长短链对应关系
  • 存储选型与成本
  • 数据分区
  • 容量/带宽/并发预估
  • 短链生成算法
  • 过期数据清理

长短链映射关系? 长链与短链之间的关系是,一对一还是一对多?

  • 个人认为一对多即可,很多时候我们需要根据短链进行活动统计,如果该长链在不同的场景需要分别统计,那么一对一的话,就不方便区分场景统计了

其他

Base62 or Base64