失效链接处理 |
如何设计一个短链系统? PDF 下载
本站整理下载:
相关截图:
主要内容:
短链的具体原理其实⽐较简单,说⽩了就是: 通过短链找到⻓链(原始链接),然后再
重定向到⻓链地址即可!
我画了⼀个简单的示意图:
举个例⼦:我们来访问 “http://gk.link/a/10q2I” 这个链接,从 HTTP 请求信息可以
看到请求被重定向了,返回的状态码为 “302”。
另外还有⼀个⽐较常⽤的重定向状态 “301” , 我们应该⽤“301” 还是“302”作为状态码
更好呢?
答案是:“302” ,绝⼤部分短链系统也都是使⽤的 “302” 作为状态码。
这是因为 “301” 状态码代表永久重定向,只要浏览器拿到⻓链之后就会对其缓存,下次
再请求短链就直接从缓存中拿对应的⻓链地址。这样的话,我们就没办法对短链进⾏相关
分析了。
⽽“302” 状态码代表资源被临时重定向了,不会存在上⾯说的这种问题。
举个例⼦:你的活动链接通过短链发送给了 10w+⽤户,你想知道短链后续的点击情
况的话,你使⽤ “301” 状态码就不⾏了。
原始链接必定是唯⼀的,我们也要确保⽣成的短链唯⼀。
如何⽣成唯⼀的短链呢?换⾔之就是我们如何通过唯⼀的字符串来表示⻓链。
⽐较常⻅的⼀种⽅法就是: 通过哈希算法对⻓链去哈希。
⼀般建议使⽤⽤⾮加密型哈希算法⽐如 MurmurHash 。因为,相⽐于 MD5 , SHA 等
加密型哈希算法,⾮加密型哈希算法往往效率更⾼!
我们拿 MurmurHash 来说, MurmurHash 当前最新的版本是 MurmurHash3 ,它能
够产⽣出 32-bit 或 128-bit 哈希值。对于绝⼤部分场景来说,32-bit 的⼀般就已经够⽤
了。
⽣成的哈希值是 10 进制的,为了缩短它的⻓度,我们可以将其转变为 62 进制即可。10
进制的 3394174629 转换为 62 进制就是 3HHBS5。
我们将 3HHBS5 作为短链的唯⼀标识拼接即可。
既然使⽤了哈希算法,那不可避免会出现哈希冲突(不同的⻓链⽣成的短链是⼀样的),
虽然概率⽐较⼩,但是我们也还是要解决。
如何判断是否发⽣了哈希冲突呢?
判断是否发⽣哈希冲突也就是看我们⽣成的短链是否是唯⼀的。
如果我们使⽤的是 MySQL,PostgreSQL 这类关系型数据库的话,我们可以给存放短链
的字段 sort_url 添加唯⼀索引。
不过,为了提⾼性能以及应对⾼并发,还是建议利⽤布隆过滤器解决这个问题。
如何解决哈希冲突呢?
解决办法其实也很简单。如果发⽣哈希冲突,我们就在⻓链后拼接⼀个随机字符串。如果
拼接了随机字符串还是发⽣哈希冲突那就再拼接⼀个随机字符串。
并且,我们要将拼接之后得到的字符串和拼接的字符串都存储起来,通过这两者可以获取
⻓链(原始链接)。
⼀个⻓链对应⼀个短链还是多个短链呢?
这个还是要看具体的业务需求。个⼈建议是⼀个⻓链可以在不同的条件(⽐如⽣成短链的
⽤户不同)下对应上不同的短链。这样的话,我们可以更好地对短链进⾏相关分析。
举个例⼦:通过⼩码短连接后台,我们可以看到短连接的访问次数、访问⼈数等信
|