用Java做一个短链接流程(附赠免费防封短链接工具一款)

发布者:三维推

2022-09-14 15:35:37

阅读: 1167

什么是短链接?简单点说,短链接就是把很长的链接缩短,比如利用三维推短链接可以将微信公众号文章的一长串链接缩短成http://d4q.cn/RtFFvic,发送出去的时候显示的是http://d4q.cn/RtFFvic,经过域名池的跳转之后,会落在最终的原链接(即对应的微信公众号文章页)。

如何利用Java设计一个短链接呢?

短链接生成算法

(1)先利用放号器对每个短链接生成请求,比如初始值为0,每申请一次,初始值+1,再把这个值转为62进制,即a-zA-Z0-9。比如第一次生成的时候放号器的值是0,对应62进制为a,再申请,值变1,62进制为b,当生成10001次的时候,放号器的值是10000,62进制为sbc。

(2)将域、服务器和放号器的62进制做一个字符串连,就可以变成短链接的链接了,比如域名是d4q.cn,10000的进制是sbc,那这个短链接的完整URL就是d4q.cn/sbc。

进制转换表

重定向过程

生成短链接后,需要存储短链接和长链接之间的映射关系,即sBc->URL。当浏览器访问短链接服务器时,它根据URLPath获得原始链接,然后执行302重定向。映射关系可以使用K-V存储,如Redis或Memcache。

算法优化

使用上述算法,对于相同的原始URL,每次生成的短链接不同,这将浪费存储空间,因为需要存储多个短链接到同一URL的映射。如果相同的URL可以映射到相同的URL,则提供一个短链接,以便节省存储空间。

(1)方案1:查表

每次生成短链接时,首先检查映射表中是否存在原始URL的映射关系,如果存在,则直接返回结果。显然,这种方法效率低下。

(2)方案2:使用LRU本地缓存,空间换时间

使用固定大小的LRU缓存,存储最近N次的映射结果,这样,如果某一个链接生成的非常频繁,则可以在LRU缓存中找到结果直接返回,这是存储空间和性能方面的折中。

如果将短链接生成服务单机部署,缺点一是性能不足,不足以承受海量的并发访问,二是成为系统单点,如果这台机器宕机则整套服务不可用,为了解决这个问题,可以将系统集群化,进行“分片”。

在以上描述的系统架构中,如果发号器用Redis实现,则Redis是系统的瓶颈与单点,因此,利用数据库分片的设计思想,可部署多个发号器实例,每个实例负责特定号段的发号,比如部署10台Redis,每台分别负责号段尾号为0-9的发号,注意此时发号器的步长则应该设置为10(实例个数)。

另外,也可将长链接与短链接映射关系的存储进行分片,由于没有一个中心化的存储位置,因此需要开发额外的服务,用于查找短链接对应的原始链接的存储节点,这样才能去正确的节点上找到映射关系。

Java短链接

以上的教程都篇技术型,如果你觉得太麻烦,可以使用三维推短链接,三维推短链接自带API接口,可以省去搭建短链接系统的流程,只需要把你的域名和三维推API接口绑定就OK了,非常方便。

点击下方图片,即可轻松拥有一款自己的短链接系统。

三维推短链接