引言
相信大家在生活中,特别是最近的双十一活动期间,会收到很多短信,而那些短信都有两个特征,第一个是几乎都是垃圾短信,这个特点此处可以忽略不计,第二个特点是链接很短,比如下面这个:
![](https://i-blog.csdnimg.cn/blog_migrate/adb0623144634c5bd84e0959d53457c5.png)
我们知道,短信有些是有字数限制的,直接放一个带满各种参数的链接,不合适,另外一点是,不想暴露参数。好处无非以下:
- 太长的链接容易被限制长度
- 短链接看着简洁,长链接看着容易懵
- 安全,不想暴露参数
- 可以统一链接转换,当然也可以实现统计点击次数等操作
那背后的原理是什么呢?怎么实现的?让你实现这样的系统,你会怎么设计呢?【来自于某鹅场面试官】
短链接的原理
短链接展示的逻辑
这里最重要的知识点是重定向,先复习一下http
的状态码:
分类 | 含义 |
---|---|
1** | 服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
那么以 3 开头的状态码都是关于重定向的:
- 300:多种选择,可以在多个位置存在
- 301:永久重定向,浏览器会缓存,自动重定向到新的地址
- 302:临时重定向,客户端还是会继续使用旧的URL
- 303:查看其他的地址,类似于301
- 304:未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。
- 305:需要使用代理才能访问到资源
- 306:废弃的状态码
- 307:临时重定向,使用Get请求重定向
整个跳转的流程:
- 1.用户访问短链接,请求到达服务器
- 2.服务器将短链接装换成为长链接,然后给浏览器返回重定向的状态码301/302
- 301永久重定向会导致浏览器缓存重定向地址,短链接系统统计访问次数会不正确
- 302临时重定向可以解决次数不准的问题,但是每次都会到短链接系统转换,服务器压力会变大。
- 3.浏览器拿到重定向的状态码,以及真正需要访问的地址,重定向到真正的长链接上。
从下图可以看出,确实链接被302
重定向到新的地址上去,返回的头里面有一个字段Location
就是所要重定向的地址:
![](https://i-blog.csdnimg.cn/blog_migrate/00282ad2d93f961edfbfdd759c6da6c9.png)
短链接怎么设计的?
全局发号器
肯定我们第一点想到的是压缩,像文件压缩那样,压缩之后再解压还原到原来的链接,重定向到原来的链接,但是很不幸的是,这个是行不通的,你有见过什么压缩方式能把这么长的数字直接压缩到这么短么?事实上不可能。就像是Huffman
树,也只能对那种重复字符较多的字符串压缩时效率较高,像链接这种,可能带很多参数,而且各种不规则的情况都有,直接压缩算法不现实。
那https://dx.10086.cn/tzHLFw
与https://gd.