看业务代码的时候,有些逻辑用到了短链接服务,感觉还蛮有意思的,这里简单的记录一下。

这种营销短信大家应该都收到过,短信有最大字符限制,而且为了更好的观感体验,短信里的链接一般都很短。现成的短链接生成服务也比较多,比如新浪、百度等,谷歌之前也有短链接服务,号称是最快的,但是在 2018 年关闭了。

一、短链接原理

我们点击短链接会发起一个 GET 方式的 HTTP 请求,当请求到对应的 API 后,会解析短链接里的标识获取到对应的长链接,然后重定向到长链接,这样整个流程就结束了。

比如我用新浪的短链接服务为 https://www.google.com/ 生成了一个短链接:http://dwz.date/evn,下面是请求短链接时对应的 HTTP 信息:

二、短链接生成算法

短链接标识一般是 [0-9, a-z, A-Z] 随机组合而成的字符串,字符一共有 62 个,因此短链接标识可以用 62 进制的字符串表示。

首先维护一个自增的 ID,当生成短链接时,将 10 进制的自增 ID 转换成 62 进制字符串,这个字符串就可以唯一标识一个长链接。由于 ID 是自增的,对应的 62 进制字符串是不同的,这样就不会出现一个短链接对应多个长链接的问题,62 个字符排列组合,可以保证短链接是用不完的,就算仅限于 6 位长度标识的短链接,也有 558 亿多种情况,这种算法在网上被称为自增序列算法。

维护自增 ID 主要有以下几种方式:

  1. 数据库主键自增
  2. redis 自增
  3. 分布式自增主键 ID(雪花算法,存在 ID 浪费)

下面是 62 进制的 encode 与 decode 方法,来自 Base62。

    private static String base62(Long b10) {StringBuilder ret = new StringBuilder();while (b10 > 0) {ret.insert(0, characters.charAt((int) (b10 % 62)));b10 /= 62;}return ret.toString();}private static long decodeBase62(String b62) {long ret = 0;b62 = new StringBuffer(b62).reverse().toString();long count = 1;for (char character : b62.toCharArray()) {ret += characters.indexOf(character) * count;count *= 62;}return ret;}

三、一些细节

  1. 自增序列算法也存在一定的缺点,当自增主键很大时,生成的 62 进制字符串会变长,以 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 顺序的 62 进制为例,当主键大于 56800235583 时,会生成 7 位长度的 62 进制字符串。这个问题可以通过控制自增主键的增长速度来解决,而且要避免主键浪费。
  2. 62 进制的顺序并不一定严格按照 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 的顺序来表示,这个顺序可以是打乱的,这样生成的短链接标识更随机不易被破解。
  3. 长链接与短链接是否需要一对多关系,同一个长链接使用自增主键 ID 算法生成的短链接是不同的,因为自增主键 ID 不同,生成的 62 进制字符串自然也不同。如果我们有一个长链接唯一对应一个短链接需求,可以将长链接进行 md5 加密,将加密后的 md5 值存储在 DB 中,每次生成短链接前都根据长链接 md5 值查询 DB,如果存在,则直接返回短链接,当然也可以使用其他方式维护这种关系。
  4. 跳转用 301 还是 302,301 永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的。同时对服务器压力也会有一定减少。
    但是如果使用了 301,我们就无法统计到短地址被点击的次数了。而这个点击次数是一个非常有意思的大数据分析数据源。能够分析出的东西非常非常多。所以选择 302 虽然会增加服务器压力,但是我想是一个更好的选择。from 短 URL 系统是怎么设计的? by iammutex
  5. 如果短链接请求频繁,可以借助 redis 做对应的缓存优化。

PS:做一次标题党,师承 SCDN 官方

最通俗易懂的短链接原理讲解相关推荐

  1. http之短链接原理分析

    1. 什么是短链接 顾名思义,短链接即是长度较短的网址.通过短链接技术,我们可以将长度较长的链接压缩成较短的链接.并通过跳转的方式,将用户请求由短链接重定向到长链接上去.短链接主要用在诸如微博,BBS ...

  2. java短链接原理_微博短链接的生成算法(Java版本)

    最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...

  3. php 长链接变为短链接,长链接转短链接原理

    长链接转短链接代码: function short_url($input = '', $salt = '') { $base62 = array ('a', 'b', 'c', 'd', 'e', ' ...

  4. URL短链接压缩算法 微博短链接原理解析

    短网址应用已经在全国各大微博上开始流行了起来.例如QQ微博的url.cn,新郎的sinaurl.cn,六度短网址6du.in等. 我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如: ...

  5. springboot实现长链接转短链接

    自己编写长链接转短链接 原理:将长链接在后台通过转换的方式转成所需的短链接(域名+(项目名)+唯一标识) 长链接转成短链接 /*** 短链接工具类*/ @Component public class ...

  6. Java 网址短链接服务原理及解决方案

    Java 网址短链接服务原理及解决方案 参考文章: (1)Java 网址短链接服务原理及解决方案 (2)https://www.cnblogs.com/xuzhujack/p/11202364.htm ...

  7. [html] 你知道短链接的生成原理吗?

    [html] 你知道短链接的生成原理吗? 目的将长度较长的链接压缩成较短的链接,并通过跳转的方式,将用户请求由短链接重定向到长链接上去1.二种方式生成短链hash-可能会重复发号器发号压缩 URL2. ...

  8. [html] 你知道短链接的生成原理吗?

    [html] 你知道短链接的生成原理吗? 目的将长度较长的链接压缩成较短的链接,并通过跳转的方式,将用户请求由短链接重定向到长链接上去1.二种方式生成短链hash-可能会重复发号器发号压缩 URL2. ...

  9. java 短链接url_Java 网址短链接服务原理及解决方案

    一.背景 现在在各种圈的产品各种推广地址,由于URL地址过长,不美观.不方便收藏.发布.传播以及各种发文字数限制等问题,微信.微博都在使用短链接技术.最近由于使用的三方的生成.解析短链接服务开始限制使 ...

最新文章

  1. python中的逻辑运算符and和or
  2. Day3--js--可恶之变量声明提升大法.。。
  3. nodejs(log4js)服务中应用splunk进行Log存储、搜索、分析、监控、警告
  4. 安装 | MATLAB2020b软件及安装教程( WIN10 64位)及运行21个图像调试代码
  5. SAP Spartacus 3.0 加载homepage的逻辑
  6. 【Servlet】获取并输出服务器获得的数据
  7. Linux命令(4):开挂机重启
  8. php 唤醒http进程,真正的PHP多线程(绝非fork或者用http再开进程)_PHP教程
  9. 《WCF技术内幕》翻译35:第2部分_第6章_通道:通道功能
  10. 2014年 教师全员远程培训挂机 教师远程全员培训挂机 教师继续教育挂机 挂机软件 全国通用版...
  11. matlab 文本框方向,ppt文本框文字方向为所有文字旋转的设置方法
  12. Linux挂载msdos分区,磁盘构造/msdos分区(fdisk)格式化(mkfs)和挂载
  13. Fires Dynamics Simulator(FDS)软件运行代码说明
  14. 选票统计 SDUT
  15. OpenCV学习之Canny算法自实现
  16. 在VMware上,ubuntu和windows之间如何复制文本、拖拽文件?
  17. LDO和DCDC电路的概述和区别
  18. XDOJ 235-月份判断
  19. Python(2)变量声明、变量类型
  20. 如何查看Oracle数据库版本

热门文章

  1. AppleTV相关使用教程
  2. C/C++ GBK2312转Unicode
  3. Linux下SVN服务器迁移(详细版)
  4. opencv中批量读取图片并保存
  5. 手机连上wif显示无法连接服务器,打开exchange management shell无法连接到服务器
  6. 14张Python基础知识点总结思维导图配搭一份视频教程还不能入门?
  7. 华为服务器新机安装配置,安装驱动,制作raid,raid5
  8. CSAPP第八、九章家庭作业(原书第二版)
  9. 重磅自动驾驶数据集来了!全球首个多传感器虚拟标注数据集免费开放
  10. 互联网营销的技巧方法和套路!