前置知识
1. 什么是短链接?
短链接就是将一个很长的原始连接(URL)通过某种算法转换成一个更短的,更容易记忆 URL,转换的短链接可能只有几个字符,而原始的连接非常的长。
比如:
这是一个原始连接:time.geekbang.org/column/intr…
这是一个短链接:gk.link/a/10q2I
2. 短链接有什么好处?
- 节约成本:短链接比长链接更简洁,节省字符空间,比如我们发短信的时候,短信是按照长度来计费的,短链接就可以帮我们节约一点钱。
- 易于分享:由于长度较短,短链接更容易记忆和输入,方便用户分享给他人。
- 短链接转成二维码,更容易识别。
其实好处还有很多,就不 一 一 列举了。
需求分析
1. 请求量
如果生成短链,或者访问短链的QPS只有个 2k 左右,我们完全可以使用 MySQL 即可。
如果访问量非常大,可以使用 MySQL + Redis 加速
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
可以这样设计:
- key:短链接,value:原始连接
- key:长连接:value:短链接
具体实现
1. 短链接的创建
具体流程:
短链接生成使用什么算法?
- 哈希函数:使用哈希函数将原始URL转换为固定长度的哈希值。常见的哈希函数包括MD5、SHA-1、SHA-256等。
- Base编码:将哈希值转换为Base62(使用0-9、a-z、A-Z)生成更短且只包含字母和数字的字符串。
- 随机生成:随机生成一个短字符串(通常包含字母和数字),并确保在数据库中没有重复。
其实还有其他的一些算法,各有优缺点,可以具体结合业务场景使用。
2. 短链接的跳转
为什么重定向是 302,不是 301?
301:永久重定向,浏览器就会缓存起来,下次请求短链接就直接从缓存中拿到原始链接。
302:临时重定向,302状态码表示这种重定向是临时的,客户端(如浏览器)应该在未来的请求中继续使用原始地址,而不是永久性地转移到新地址。
使用 302有什么好处?
假设我们向统计某个短链接的访问次数,点击量,等等,如果使用301永久重定向,那么我们就拿到不用户的行为了。就无法对用户的行为进行监控,其实有点失去做短链接服务的意义了。
怎么理解 301 和 302?我跟你讲个故事。
好比如你是一个中介,现在你带人去看房子,房东跟你说这房子1000就可以租了,但是咱也是有头脑的,直接跟租客说,这房子一个月6000起步。
此时租客说:可不可以便宜一点?4000怎么样?
我:一脸很为难的样子,假装打了个电话问一下房东。好了,房东跟我说4000也行。
租客:心里笑嘻嘻。
我也笑嘻嘻。
302就是:用户的请求需要经过我这个中介,才能告诉房东。
301就是:用户第一次来的时候,听到价格犹豫不决,由我代为转达。第二次,直接偷偷的拿到房东的电话,直接跟房东聊。
如果是301的话,他之后不经过我,那我就不能坑他中介费了。