Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

如何设计一个短链系统? PDF 下载


分享到:
时间:2023-03-12 10:12来源:http://www.java1234.com 作者:转载  侵权举报
如何设计一个短链系统? PDF 下载
失效链接处理
如何设计一个短链系统? PDF 下载


本站整理下载:
提取码:i6kn 
 
 
相关截图:
 
主要内容:

短链的具体原理其实⽐较简单,说⽩了就是: 通过短链找到⻓链(原始链接),然后再
重定向到⻓链地址即可!
我画了⼀个简单的示意图:
举个例⼦:我们来访问 “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 添加唯⼀索引。
不过,为了提⾼性能以及应对⾼并发,还是建议利⽤布隆过滤器解决这个问题。
如何解决哈希冲突呢?
解决办法其实也很简单。如果发⽣哈希冲突,我们就在⻓链后拼接⼀个随机字符串。如果
拼接了随机字符串还是发⽣哈希冲突那就再拼接⼀个随机字符串。
并且,我们要将拼接之后得到的字符串和拼接的字符串都存储起来,通过这两者可以获取
⻓链(原始链接)。
⼀个⻓链对应⼀个短链还是多个短链呢?
这个还是要看具体的业务需求。个⼈建议是⼀个⻓链可以在不同的条件(⽐如⽣成短链的
⽤户不同)下对应上不同的短链。这样的话,我们可以更好地对短链进⾏相关分析。
举个例⼦:通过⼩码短连接后台,我们可以看到短连接的访问次数、访问⼈数等信

------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐