如何设计一个短链系统

456 阅读4分钟

前置知识

1. 什么是短链接?

短链接就是将一个很长的原始连接(URL)通过某种算法转换成一个更短的,更容易记忆 URL,转换的短链接可能只有几个字符,而原始的连接非常的长。

比如:

这是一个原始连接:time.geekbang.org/column/intr…

这是一个短链接:gk.link/a/10q2I

2. 短链接有什么好处?

  1. 节约成本:短链接比长链接更简洁,节省字符空间,比如我们发短信的时候,短信是按照长度来计费的,短链接就可以帮我们节约一点钱。
  2. 易于分享:由于长度较短,短链接更容易记忆和输入,方便用户分享给他人。
  3. 短链接转成二维码,更容易识别。

其实好处还有很多,就不 一 一 列举了。

需求分析

1. 请求量

如果生成短链,或者访问短链的QPS只有个 2k 左右,我们完全可以使用 MySQL 即可。

如果访问量非常大,可以使用 MySQL + Redis 加速

2. 功能设计

短链接服务,最主要的功能就是,短链接的创建,短链接的跳转

短链接的创建:

  1. 生成短链使用什么算法?短链接的长度要多少位?
  2. 正常应该是一个长链对应一个短链,也可以一个长链对应多个短链,对于用户来说无所谓,但是一对一可以节约内存
  3. 短链接的时长设置
    1. 可以永久有效
    2. 也可以有有效期,比如限时活动,过期就不需要了

短链接的跳转:

短链接如何跳转到原始连接?

架构设计

服务: 我们只需要一个短链接服务

存储:MySQL

create table t_link
(
    id              bigint auto_increment comment 'id'primary key,
    short_url  varchar(128)                         null comment '短链接',
    origin_url      varchar(1024)                   null comment '原始链接',
    Index idx_short_url(short_url),
    Index idx_origin_url(origin_url)
);

我给长连接和短链接都加上了索引,因为后续我们采用的一个长连接对应一个短链的方式,可以根据短链接查询原始链接,也可以根据原始链接查询短链接。

如果使用了Redis

可以这样设计:

  1. key:短链接,value:原始连接
  2. key:长连接:value:短链接

具体实现

1. 短链接的创建

具体流程:

短链接生成使用什么算法?

  1. 哈希函数:使用哈希函数将原始URL转换为固定长度的哈希值。常见的哈希函数包括MD5、SHA-1、SHA-256等。
  2. Base编码:将哈希值转换为Base62(使用0-9、a-z、A-Z)生成更短且只包含字母和数字的字符串。
  3. 随机生成:随机生成一个短字符串(通常包含字母和数字),并确保在数据库中没有重复。

其实还有其他的一些算法,各有优缺点,可以具体结合业务场景使用。

2. 短链接的跳转


为什么重定向是 302,不是 301?

301:永久重定向,浏览器就会缓存起来,下次请求短链接就直接从缓存中拿到原始链接。

302:临时重定向,302状态码表示这种重定向是临时的,客户端(如浏览器)应该在未来的请求中继续使用原始地址,而不是永久性地转移到新地址。

使用 302有什么好处?

假设我们向统计某个短链接的访问次数,点击量,等等,如果使用301永久重定向,那么我们就拿到不用户的行为了。就无法对用户的行为进行监控,其实有点失去做短链接服务的意义了。

怎么理解 301 和 302?我跟你讲个故事。

好比如你是一个中介,现在你带人去看房子,房东跟你说这房子1000就可以租了,但是咱也是有头脑的,直接跟租客说,这房子一个月6000起步。

此时租客说:可不可以便宜一点?4000怎么样?

我:一脸很为难的样子,假装打了个电话问一下房东。好了,房东跟我说4000也行。

租客:心里笑嘻嘻。

我也笑嘻嘻。

302就是:用户的请求需要经过我这个中介,才能告诉房东。

301就是:用户第一次来的时候,听到价格犹豫不决,由我代为转达。第二次,直接偷偷的拿到房东的电话,直接跟房东聊。

如果是301的话,他之后不经过我,那我就不能坑他中介费了。