什么是短链接
就是你经常在手机短信,或者微博上看到的 URL,都是很短的并且像 t.cn 这种开头的,限制字数,短信发送按字数收费,微博限制回复长度等等。
首先大概的实现思路
知乎上有很多回答,典型的错误回答有
- 用 MD5 等 hash 直接得出定长字符,没有考虑冲突的情况,在这种情况下冲突是很严重的,不可以忍受的。
正确的实现方法是,利用进制转化,也就是低进制转换为高进制,数的长度会变得很小,例如 1000(2) = 8(10),一下子就去掉了三位。
所以给每个长 url 一个自增 10 进制 id,然后用 10 进制 id 转换为 62 进制,为什么 62 进制呢?因为 10 个阿拉伯数字 +26×2 个英文字母,共 62 位,这样的话,6 位 62 进制数字也就有了 500 多亿个,也够用了。
长链每次返回的都是同一个短链怎么实现的呢?
比较好的方法,建立一个 hash-table,存在 redis 里面很好,长链作为 key,短链作为 value,并且设置一个过期时间,如果有人再次同一长链转为短链,则返回原来短链,并且把过期时间变长等等。
使用短链接过程
- 向 dns 请求短链服务的 ip,并访问。
- 短链接直接返回 302/301 重定向到你自己的 url
PS:302/301 都为重定向
301 redirect: 301 代表永久性转移 (Permanently Moved) 302 redirect: 302 代表暂时性转移 (Temporarily Moved )
我认为这里我们是要返回 301 的也就是永久重定向,因为我们不会再回去访问短链服务了
但是 301 的话无法统计这个短链接被访问的时候次数,也就是不能看到这个数据,但其实还是很有用的。所以很多情况还是使用 302 的。