相信大家在生活中,特别是最近的双十一活动期间,会收到很多短信,而那些短信都有两个特征,第一个是几乎都是垃圾短信,这个特点此处可以忽略不计,第二个特点是链接很短,比如下面这个:
我们知道,短信有些是有字数限制的,直接放一个带满各种参数的链接,不合适,另外一点是,不想暴露参数。好处无非以下:
太长的链接容易被限制长度
短链接看着简洁,长链接看着容易懵
安全,不想暴露参数
可以统一链接转换,当然也可以实现统计点击次数等操作那背后的原理是什么呢?怎么实现的?让你实现这样的系统,你会怎么设计呢?
整个跳转的流程:
1.用户访问短链接,请求到达服务器
2.服务器将短链接转换成为长链接,然后给浏览器返回重定向的状态码301/302
301永久重定向会导致浏览器缓存重定向地址,短链接系统统计访问次数会不正确
302临时重定向可以解决次数不准的问题,但是每次都会到短链接系统转换,服务器压力会变大。
3.浏览器拿到重定向的状态码,以及真正需要访问的地址,重定向到真正的长链接上。
实现一个算法,将长地址转成短地址。实现长和短一一对应。然后再实现它的逆运算,将短地址还能换算回长地址。
比较烂的回答有随机生成一个短地址,去查找是否用过,用过就再随机,如此往复,直到随机到一个没用过的短地址。
上面是典型的错误回答,下面咱们直接说正确的原理。正确的原理就是通过发号策略,给每一个过来的长地址,发一个号即可,小型系统直接用 mysql 的自增索引就搞定了。如果是大型应用,可以考虑各种分布式 key-value 系统做发号器。不停的自增就行了。
总结
当我们在浏览器里输入 https://url.cn/5fslXqH 时
DNS首先解析获得 https://url.cn 的 IP 地址
当 DNS 获得 IP 地址以后(比如:127.0.0.1),会向这个地址发送 HTTP GET 请求,查询短码 5fslXqH
https://url.cn 服务器会通过短码 5fslXqH 获取对应的长 URL
请求通过 HTTP 301 转到对应的长 URL https://github.com/zgpeace/geekTimeQrcode。