微博限定用户每次输入最多 140个字符,用户如果传字符串很长的链接,怎么办?

人生有涯,学海无涯

01、什么是短链

大家在日常的工作或者生活中应该经常会遇到短链,可能很多人对短链这个名词不熟悉,不过看到肯定都会熟悉的,比如:https://t.zsxq.com/UZNF2RZ,或者 https://mp.weixin.qq.com/s/J4BWQIILaaAw2POGA__jjg。其实像这种 URL 看起来没有任何含义,短小精干的字符就是短链。

短链:顾名思义就是将 URL 的长度缩短了,用户不需要记住或者填写很长的 URL,通过这些短小的 URL 就可以跳转的相应的网页。

02、使用场景

通过上面的说明短链既然只是把长长的 URL 转换为短小的 URL 那么到底有什么使用场景呢?

  1. 首先在现在的社交网络微博或者 Twitter 都有 140 个字符的限制,那如果这个时候用户想要分享一个很长的 URL 那自然是无法实现的,那么这个时候短链就有了用武之地了。自动将用户的长链转换成短链,这样就可以完美的解决这个问题,方便大家在社交网络上传播。
  2. 长链中经常会出现中文或者特殊字符,在使用 encode 之后看起来很不优雅,这个时候我们也可以考虑才用短链的形式来美化我们的 URL。

03、如何生成短链

既然我们知道了短链有这么用处和场景,那我们如何设计一个短链系统呢?

首先如果不想重复制造轮子,网上也有很多开源的方案大家可以参考,比如百度的短链生成服务 https://dwz.cn/ ,新浪的服务http://dwz.wailian.work/。大家可以在平台上面输入长网址,点击转换自动会生产短链,给大家演示一个例子,加深大家的印象和看一下实际效果。

shorturl01.png

大家可以看到百度短链生成的地址最后的字符串的长度是 8 位。不同的短链服务生成的长度不一样,这个要看具体的实现方式。

思考

下面我们看来如何设计一个自己的短链服务。

实现一个短链服务首先要解决这么几个问题,

  1. 短链和原始链接如何对应?
  2. 一个原始链接对应一个短链还是一个原始链接对应多个链接?
  3. 短链应该多短呢?
  4. 采用何种重定向方式到原始链接呢?

首先短链和原始链接的对应关系我们可以通过 Redis 或者 MySQL 进行存储,我们需要找到一种算法能实现短链和长链的对应,不管是一对一还是多对一,具体的算法我们下面介绍。另外短链和长链是一对一还是多对一这个需要根据具体的业务来确定,正常情况下我们可以采用一对一,但是有些场景我们需要根据不同来源设置不同的短链从而达到统计用户信息的目的,这个时候就需要实现多对一了。

另外短链到底应该设计多短呢?

我们看下一般短链使用的都是大小写字母加数字,总共 62 个。62^7= 3.5216146e+12,这个数字已经远远的超过了互联网上所有网址的大小了。所以我们可以看到一般 7 位就已经够了。

那我们应该采用何种重定向方式呢?

首先我们知道重定向有 301 和 302,301 和 302 的区别是 301 表示永久重定向,302 表示暂时性转移。所以我们具体使用哪个重定向也是要根据具体的业务来,如果不需要对短链来源做一些数据采集那么 301 就可以了,短链一经生成就不会变化,所以用301是符合http语义的。但是如果说需要对短链来源做一些实时的数据采集,比如点击数统计,UA 信息统计,那么还是建议使用 302。

生成算法

短链的生成算法目前主要有两种方案,分别如下:

  1. Hash 摘要算法
  2. 自增 ID(分布式 ID)

Hash 摘要算法的实现方式是首先将长链进行 Hash 运算得到一个 64 位的整数,再将这个整数转换为 62 进制,取低 7 位即可。Hash 算法虽然简单,但是容易冲突,如果说在大量生成短链的时候会增加冲突,还需要想办法解决冲突的问题。

自增 ID 方式不会出现冲突的情况,而且如果是采用的关系型数据库存储,那本身就会自动生成 ID,只需要进行 62 位进制转换就可以了。采用这种方案我们需要注意几个问题,第一个是如果是分布式环境下可能需要分布式 ID 生成器,就不能简单的用一台数据库去生成 ID 了,另外一个是需要加一个缓存,针对同一个长链我们不需要多次生成短链(特殊情况除外),这样就可以防止同一个长链被生成了多个短链,如果不小心被攻击了,就会导致短时间 ID 申请过多的问题。

04、总结

这篇文章简单给大家介绍了一下什么是短链以及短链的使用场景和常规生成算法。关于短链我想大家在日常工作和学习中多多少少都会遇到和使用,欢迎大家到我们《Java 极客技术》知识星球中一起学习和进步,扫描下放二维码还有优惠,我们在知识星球中等你。

子悠-知识星球

Java Geek Tech wechat
欢迎订阅 Java 极客技术,这里分享关于 Java 的一切。