一、什么是短网址?

我们的URL地址常常会因为需要携带各式各样的参数,或者随着业务增长,变得越来越长。对于用户而言,过长的链接体验必然是不好的。这时候短网址就应用而生了,也称为短链接。

短网址,就是把普通网址,就是将长的URL网址,通过程序计算等方式,转换成比较短的网址。比如:http://t.cn/RlB2PdD 这种,在短信、微博、推特这种限制字数的应用里,好处不言而喻。短、字符少、美观、便于发布、传播。

早期短链接广泛应用于图片上传网站,通过缩短网址URL链接字数,达到减少代码字符串的目的。更便于使用者引用网址,写入代码中,节省字符数空间。常见于网店图片分类的使用,因有字符限制,运用短链接,达到外链图片的目的,自微博盛行以来,在微博字数有限的特色下,短链接也盛行于微博网站,以节省字数,给博主发布更多文字的空间。

短网址主要有几个作用:

  • 缩短原链接长度,便于营销推广
  • 数据统计,在重定向的过程中进行PV、UV等数据统计
  • 屏蔽原链接域名

长链接示例:https://mp.weixin.qq.com/s?__biz=MjM5NDY4NTE3OQ==&mid=2651269335&idx=1&sn=e59da82933e14847e59805bb576ea67d&chksm=bd7781438a0008553739cb38cbfd3fecc0ef1e6f531246d94dffda2cb955ddd1c174282b5ae2&mpshare=1&scene=1&srcid=&sharer_sharetime=1569315641509&sharer_shareid=7ff493d8e10e2437e9ad26c2640bbd82&key=5e4f3af4a46b639999714044064b8775d4864dc1a3bf6c91bef294023de61b42d655790ce363a528ef40d0fb4c8681d130a496942e47c424a02c229fb1dbdb0e995c994251fc21c9dc39bc92396b1357&ascene=1&uin=MjUwMjg1NTU%3D&devicetype=Windows+10&version=62060834&lang=zh_CN&pass_ticket=XQAvYTEp9FZSAZWm3M5Ac4SSkUIXtVIZgxIndU7lM38%3D

百度短网址 http://dwz.cn/
谷歌短网址服务 https://goo.gl/ (需科学上网)号称是最快的 ?

二、短网址的实现原理解析

当我们在浏览器里输入 http://t.cn/RlB2PdD 时

  1. DNS首先解析获得 http://t.cn 的 IP 地址
  2. 当 DNS 获得 IP 地址以后(比如:74.125.225.72),会向这个地址发送 HTTP GET 请求,查询短码 RlB2PdD
  3. http://t.cn 服务器会通过短码 RlB2PdD 获取对应的长 URL
  4. 请求通过 HTTP 301 转到对应的长 URL https://m.helijia.com 。

这里有个小的知识点,为什么要用 302 跳转而不是 301 呢?

301是永久重定向,302是临时重定向。短地址一经生成就不会变化,所以用301是符合http语义的。但是如果用了301, Google,百度等搜索引擎,搜索的时候会直接展示真实地址,那我们就无法统计到短地址被点击的次数了,也无法收集用户的Cookie, User Agent 等信息,这些信息可以用来做很多有意思的大数据分析,也是短网址服务商的主要盈利来源。

所以选择302虽然会增加服务器压力,但是我想是一个更好的选择。

通过上面的分析,会发现我们的核心问题就是如何用长网址来生成对应的短网址。

三、短网址的长度设计

我们的需求是生成短网址,当然是尽可能地短,那到底什么样的长度合适呢?

短码一般是由 [a - z, A - Z, 0 - 9] 这62 个字母或数字组成,我们可以把短网址的字符串理解为一个62进制的数(想想16进制你就明白了),微博的短网址是7位,那么最大能表示{62}^7=3521614606208个网址,这是多少呢?可以说比现在互联网所有的链接都都多了好多数量级,这样就避免了短网址重复的问题。

现代的web服务器(例如Apache, Nginx)大部分都区分URL里的大小写,所以用大小写字母来区分不同的URL是没问题的。因此,正确答案:长度不超过7的字符串,由大小写字母加数字共62个字母组成。

四、短网址的生成算法

现在我们设定了短网址是一个长度为7的字符串,如何计算得到这个短网址呢?

两种算法:

  1. 自增序列算法:设置 id 自增,一个 10进制 id 对应一个 62进制的数值,1对1,也就不会出现重复的情况。这个利用的就是低进制转化为高进制时,字符数会减少的特性。
  2. 哈希算法:先hash得到一个64位整数,将它转化为62进制整数,截取低7位即可。

但是哈希算法会有冲突,所以我们应该使用第一种方式来实现。10进制转成62进制的具体实现:

function string10to62(number) {const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ';const charsArr = chars.split('');const radix = chars.length;let qutient = +number;let arr = [];do{let mod = qutient % radix;qutient = (qutient - mod) / radix;arr.unshift(charsArr[mod]);}while(qutient);return arr.join('');
}

但是短码 id 是从一位长度开始递增,短码的长度不固定,不过可以用 id 从指定的数字开始递增的方式来处理,确保所有的短码长度都一致。同时,生成的短码是有序的,可能会有安全的问题,可以将生成的短码id,结合长网址等其他关键字,进行md5运算生成最后的短码。

五、具体的实现流程图

实现流程图如下:

六、扩展

前面我们使用的是一个自增序列来实现id的不重复,但对于高并发环境下,自增序列的实现方式值得考量,同学们可能会说可以利用Redis的单线程自增函数来实现,当然是可以的,但我们不需要自行实现,有现成的轮子可以使用,那就是:

分布式发号器(Distributed ID Generator)。

关于分布式发号器的内容,我们下回再叙。

七、思考

一个长网址,对应一个短网址,还是可以对应多个短网址?

这也是个重大选择问题。一般而言,一个长网址,在不同的地点,不同的用户等情况下,生成的短网址应该不一样,这样,在后端数据库中,可以更好的进行数据分析。如果一个长网址与一个短网址一一对应,那么在数据库中,仅有一行数据,无法区分不同的来源,就无法做数据分析了。

以这个7位长度的短网址作为唯一ID,这个ID下可以挂各种信息,比如生成该网址的用户名,所在网站,HTTP头部的 User Agent等信息,收集了这些信息,才有可能在后面做大数据分析,挖掘数据的价值。短网址服务商的一大盈利来源就是这些数据。

正确答案:一对多

短网址系统参考代码:https://github.com/gentoo111/shortLink


我的微信公众号:架构真经(关注领取免费资源)

参考文章

  1. https://www.jianshu.com/p/d7c1edc0836e
  2. https://segmentfault.com/a/1190000012088345?utm_source=tag-newest
  3. https://blog.csdn.net/JH_Zhai/article/details/80379103
  4. https://www.jianshu.com/p/c9b49ac268e5
  5. https://www.zhihu.com/question/20103344/answer/573638467
  6. https://www.cnblogs.com/feiyafeiblog/p/8581853.html

算法高级(38)-短网址(short URL)系统如何实现?相关推荐

  1. 转:短网址(short URL)的实现_如何生成短链接URL?

    什么是短链接 ? 就是把普通网址,转换成比较短的网址.比如:这种http://t.cn/ E70Piib,在微博这些限制字数的应用里.好处不言而喻:短.字符少.美观.便于发布.传播. 我们应该都能想到 ...

  2. Python爬虫:利用百度短网址缩短url

    写爬虫程序的时候,会遇到目标网址太长,存入数据库存入不了的情况,这时,我们可以通过百度短网址服务将网址缩短之后再存入 百度短网址:http://dwz.cn/ 百度短网址接口文档:http://dwz ...

  3. php 短网址 算法,php生成短网址的思路以及实现方法

    短网址流行的已经有一段时间了,以前做新浪微博应用的时候就有接触,但没有搞清楚,最近再次接触到这个东东,仔细研究了下,发现短网址其实也挺容易的.下面就将本次对于生成短网址的思路以及使用php生成短网址的 ...

  4. 百度SEO站群腾讯短网址w.url.cn生成源码|仿红源码

    源码介绍: 腾讯短网址,微信公众号接口w.url.cn短网址生成示例,编辑Creat-dwz.php,修改你的appid和appsecret即可,要求认证的服务号才拥有接口权限,订阅号均无权限使用,可 ...

  5. 最新短网址链接生成系统源码+短链防红功能

    正文: 前两年流行的新浪短网址和一些小站长搭建的短网址基本都没了,想要一个既稳定又好用的短网址系统只有自己搭建了,今天给大家分享一个很好用的短网址系统. 本系统是国内程序员开发,后台简洁,适合自用. ...

  6. 网址短连接 short url

    短连接网址介绍: java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java 百度短连接服务:http://dwz.cn/ 1.百度的短链接域名是dwz.cn 2.百度的短链接 ...

  7. 短址(short URL)原理及其实现

    http://blog.csdn.net/beiyeqingteng/article/details/7706010 URL 解析: 当我们在浏览器里输入 http://goo.gl/Jfs6q 时, ...

  8. 微信短链接服务器,微信短网址w.url.cn 接口api开发文档

    //md5签名方式--非简单签名 header("Content-Type:text/html;charset=UTF-8"); date_default_timezone_set ...

  9. 算法高级(1)-概述

    算法是对特定问题求解步骤的描述.对于同一个问题,我们可能会用不同的算法来求解,我们可以根据算法的可读性.效率等进行取舍.针对不同的数据保存方式,也会有不同的算法. 很多同学会觉得,我工作经验五年,工作 ...

最新文章

  1. 宏基因组报名倒计时!报名线上课还可免费参加线下课
  2. 大数的相加 乘 余 幂
  3. 讨论ALL_ROWS模式和FIRST_ROWS模式
  4. CentOS7 下安装 Redis
  5. [结构力学] 铰结三角形规律中虚铰也记为单铰
  6. 这脑洞绝了!中美合拍动画《哪吒与变形金刚》来了
  7. linux 进程 堆大小,Linux进程的默认分配堆大小
  8. Python 微信表情包打印发送中秋快乐
  9. Kubernetes详细笔记
  10. z世代中的z是什么意思_开放是与Z世代合作的关键
  11. 产品经理眼中的SLAM技术学习路径
  12. POJ2586-Y2K Accounting Bug
  13. 记一次小米手机安装Google Play(其他手机类似)
  14. 2018年7月21日日报
  15. matlab中如何定义整形变量,MATLAB中定义变量的问题
  16. 【houdini vex】方块穿插
  17. putty 串口暂停_win7系统中使用putty串口设置超级终端的方法
  18. 市场经济下的“按劳分配”
  19. H5培训第一天基础知识总结
  20. 微信小程序API(功能)常用使用地址

热门文章

  1. 职场七种最致命的想法
  2. ZAB 协议和Paxos 算法
  3. Spring Mvc Controller返回值、参数绑定、参数校验 (高级二)
  4. java常用的正则表达式
  5. Git简单命令 学习资源贴
  6. 判断是否为ajax请求
  7. ajax post 与get方法 data写法
  8. Java高并发编程详解系列-线程上下文设计模式及ThreadLocal详解
  9. Python精通-运算符与基本数据类型(二)
  10. Java高并发编程详解系列-7种单例模式