前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >面试必备:如何将一个长URL转换为一个短URL?

面试必备:如何将一个长URL转换为一个短URL?

作者头像
Java后端技术
发布于 2018-08-09 07:51:46
发布于 2018-08-09 07:51:46
7.6K0
举报
文章被收录于专栏:Java后端技术栈Java后端技术栈

一、前言

前几天整理面试题的时候,有一道试题是《如何将一个很长的URL转换为一个短的URL,并实现他们之间的相互转换?》,现在想起来这是一个绝对不简单的问题,需要考虑很多方面,今天和大家一起学习研究一下!

短网址:顾名思义,就是将长网址缩短到一个很短的网址,用户访问这个短网址可以重定向到原本的长网址(也就是还原的过程)。这样可以达到易于记忆、转换的目的,常用于有字数限制的微博、二维码等等场景。

关于短URL的使用场景,举个简单的例子来说明一下,看一下业务中使用短URL的重要性!

二、短地址使用场景

1、新浪微博

我们在新浪微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:https://t.cn/RuPKzRW。为什么要这样做的?

这是因为微博限制字数为140字一条,那么如果我们需要发一些链接上去,但是这个链接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的或者说用户体验很差的,所以短网址应运而生了,短网址这种服务可以说是在微博出现之后才流行开来的!往下看:

(1)首先,我先发一条微博带有一个URL地址:

(2)然后,看他转换之后显示的效果是什么样子的哪?

(3)查看对应页面元素的HTML源码如下:

(4)可以看出:https://blog.csdn.net/xlgen157387/article/details/79863301 被转换为:http://t.cn/RuPKzRW,此时你访问http://t.cn/RuPKzRW是可以定位到https://blog.csdn.net/xlgen157387/article/details/79863301,也就是实现了转换。

2、短网址二维码

网址在转换成短网址时,也可以生成相应的短网址二维码,短网址二维码的应用,二维码核心解决的是跨平台、跨现实的数据传输问题;而且二维码跟应用场景结合之后,所能解决的问题会越来越多。

(1)短网址二维码相比短链接更方便,能少输入,尽量少输入,哪怕只是少点一下键盘,都是有意义的。

(2)二维码只是扫描一个简单的链接,打开的却是一个世界。想象一下,用手机购买售货机里商品,二维码扫描是略快于从用手机找到该售货机并找到该商品的,而且这种操作相对于搜索/查找而言不是更优雅吗?

(3)所有商超里面的商品,都是使用条码来确定商品的唯一性的,去买单的时候都是扫描条码。试想,如果里面加入了更多产品的生产日期、厂家、流转途径、原材料等等信息,是不是厉害了呢?特别是针对食品信息的可追溯上,二维码应用场景更广泛。

三、短地址的好处

除了上述场景中,我们将长地址转换为短地址的使用场景的优点(压缩URL长度)之外,短地址还具有很多实际场景中的优点,例如:

(1)节省网址长度,便于社交化传播,一个是让URL更短小,传播更方便,尤其是URL中有中文和特殊字符,短网址解决很长的URL难以记忆不利于传播的问题;

(2)短网址在我们项目里可以很好的对开放以及对URL进行管理。有一部分网址可以会涵盖性、暴力、广告等信息,这样我们可以通过用户的举报,完全管理这个连接将不出现在我们的应用中,对同样的URL通过加密算法之后,得到的地址是一样的;

(3)方便后台跟踪点击量、地域分布等用户统计。我们可以对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点,这样有利于我们对项目的后续工作更好的作出决策;

(4)规避关键词、域名屏蔽手段、隐藏真实地址,适合做付费推广链接;

(5)当你看到一个淘宝的宝贝连接后面是200个“e7x8bv7c8bisdj”这样的字符的时候,你还会觉得舒服吗。更何况微博字数只有140字,微博或短信里,字数不够,你用条短网址就能帮你腾出很多空间来;

四、短网址服务提供平台

目前,国内网又很多提供短地址服务的平台,例如:

  • 新浪:http://sina.lt/
  • 百度:http://dwz.cn/
  • 0x3:http://0x3.me/
  • MRW:http://mrw.so/

等等还有很多,这个可以搜索一下就会有很多!但是一个注意的是,如果使用某一个平台的短地址服务,一定要保证长期可靠的服务,不然一段时间失效了,我们以前已经转换的URL就完了!

这里以百度例,将我们上述博客的地址转换为短地址如下所示:

当然,对于我们的业务来说,如果自己可以提供自己的短URL服务那才是更好的,不需要受制于人!(中国芯片需要崛起!!!)

五、关于如何生成短地址URL的讨论

关于短地址URL如何生成方式的,网上有很多方式,有基于映射的,有基于Hash的,有基于签名的,但是总的来说并不能满足绝大部分场景的使用,或者说是一种错误的设计方式。这里不再重复造轮子!以下是知乎用户iammutex关于该问题的探讨,截图过来和大家一起学习一下:

六、生成短地址URL需要注意的

看到上述知乎用户iammutex关于如何正确生成短地址URL的探讨,我们知道了,可以通过发号器的方式正确的生成短地址,生成算法设计要点如下:

(1)利用放号器,初始值为0,对于每一个短链接生成请求,都递增放号器的值,再将此值转换为62进制(a-zA-Z0-9),比如第一次请求时放号器的值为0,对应62进制为a,第二次请求时放号器的值为1,对应62进制为b,第10001次请求时放号器的值为10000,对应62进制为sBc。

(2)将短链接服务器域名与放号器的62进制值进行字符串连接,即为短链接的URL,比如:t.cn/sBc。

(3)重定向过程:生成短链接之后,需要存储短链接到长链接的映射关系,即sBc -> URL,浏览器访问短链接服务器时,根据URL Path取到原始的链接,然后进行302重定向。映射关系可使用K-V存储,比如Redis或Memcache。

七、生成短地址之后如何跳转哪?

对于该部分的讨论,我们可以认为他是整个交互的流程,具体的流程细节如下:

(1)用户访问短链接:http://t.cn/RuPKzRW;

(2)短链接服务器t.cn收到请求,根据URL路径RuPKzRW获取到原始的长链接(KV缓存数据库中去查找):https://blog.csdn.net/xlgen157387/article/details/79863301;

(3)服务器返回302状态码,将响应头中的Location设置为:https://blog.csdn.net/xlgen157387/article/details/79863301;

(4)浏览器重新向https://blog.csdn.net/xlgen157387/article/details/79863301发送请求;

(5)返回响应;

八、短地址发号器优化方案

1、算法优化

采用以上算法,如果不加判断,那么即使对于同一个原始URL,每次生成的短链接也是不同的,这样就会浪费存储空间(因为需要存储多个短链接到同一个URL的映射),如果能将相同的URL映射成同一个短链接,这样就可以节省存储空间了。主要的思路有如下两个:

方案1:查表

每次生成短链接时,先在映射表中查找是否已有原始URL的映射关系,如果有,则直接返回结果。很明显,这种方式效率很低。

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

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

2、可伸缩和高可用

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

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

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

九、如何用代码实现短地址

说到这里终于说到重点了,很多小伙伴已经按捺不住了,不好意思让大家失望了,这只是一片简单的文章,并不能把这么繁杂的一个系统演示清楚!秉着不要重复造轮子的原则,这里给出一个为数不多还算可以的实现短地址的开源项目:urlshorter

注意:urlshorter本身还是基于随机的方式生成短地址的,并不算是一个短地址发号器,因此会有性能问题和冲突的出现,和知乎用户iammutex 描述的实现方式还是有区别的!而关于短地址发号器的方式目前还没有找到更好的开源项目可供参考!

项目地址:https://gitee.com/tinyframework/urlshorter

十、总结

到此为止,我们一起学习了什么是短地址,短地址的优点,如何选择一种正确的方式来实现我们的短地址,以及在码云上找到的一个还算可以的短地址生成项目,相信此时的你能够有一个更好的了解!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​2021-03-25:如何把长url转换为短url?
1.长url和短url一一映射。想采用某种算法,把长url和短url做一一映射。后来发现,这种方法是行不通的。如果行得通,那么压缩算法就是一片新天地了。失败方法。
福大大架构师每日一题
2021/03/25
8290
手把手教你造轮子:这个价值100万的短网址微服务,我送给你
网上已经有产品,用着还不错。可是,作为程序员,从零开始造轮子,开发一个属于自己的短网址服务器,这想法amazing!
程序员小助手
2020/04/08
5900
高性能短链设计
今天,我们来谈谈如何设计一个高性能短链系统,短链系统设计看起来很简单,但每个点都能展开很多知识点,也是在面试中非常适合考察侯选人的一道设计题,本文将会结合我们生产上稳定运行两年之久的高性能短链系统给大家简单介绍下设计这套系统所涉及的一些思路,希望对大家能有一些帮助。
范蠡
2020/03/18
3.1K0
微信w.url.cn短链接口
公众平台长链接转短链接服务将升级为新域名mmbizurl.cn,原有w.url.cn仍可以正常访问,t.cn加了网址白名单,只允许政府和企业单位使用所以也不能用了 ,url.cn也不知道为什么不让用了,没有几个能用的了,更多说明点我查看,今天弄了个w.url.cn短链接口,分享一哈,测试可用。 之前也发过一个,这里一起引用学习一下吧
qiangzai
2021/12/21
3.9K1
微信w.url.cn短链接口
字节二面:100Wqps短链系统,如何设计?
这段时间,在整理知识星球中面试专栏时看到这么一个字节跳动的二面真题:100Wqps短链系统,怎么设计?
码猿技术专栏
2023/05/01
4.2K1
字节二面:100Wqps短链系统,如何设计?
短网址(short URL)系统的原理及其实现
作者: 小猿大圣 https://segmentfault.com/a/1190000012088345 背景 提供一个短址服务。 你有没有发现,我们的任务中出现长 URL 就会比较麻烦?
前端教程
2018/03/05
5.3K0
短网址(short URL)系统的原理及其实现
设计一个系统将长链接地址转为短链接地址
最近遇到一个面试题,问请你设计一个系统将长链接转为短链接。起初回答的不是很好,之后通过自己思考和查阅资料将这块的内容进行整理。
翎野君
2023/05/12
1.1K0
设计一个系统将长链接地址转为短链接地址
如何设计一个短链接系统
短链接是一种将长URL地址转换为较短、易于记忆的链接的技术。它通过使用特定的算法或服务将长链接压缩成更短的形式,以便在限制字符长度或需要更简洁的场景下使用。
柯柏技术笔记
2024/01/10
7790
如何设计一个短链接系统
短链系统设计-用户自定义短链
实现一个顾客短网址,使得顾客能创立他们自己的短网址。即你需要在前文基础上再实现一个 createCustom。
JavaEdge
2022/09/14
2.2K0
短链系统设计-用户自定义短链
URL短网址生成算法原理
短网址(Short URL),是在形式上比较短的网址,通过映射关系跳转到原有的长网址。
阳光岛主
2019/02/18
4.6K2
腾讯url短网址在线生成_腾讯(url.cn)短网址链接生成api接口
免费缩短网址缩短工具,提供安全的网址缩短、短网址生成服务及稳定的短网址API接口;具有稳定、快速、安全的特点,支持批量缩短、批量短网址还原、数据报表、开放API接口等服务。
用户2557763
2021/12/30
9.2K0
腾讯url短网址在线生成_腾讯(url.cn)短网址链接生成api接口
永久短网址生成 可以永久使用的短链接推荐
微博、短信、微信在推送信息的时候都有字符的数量限制,如果分享一个长网址,很容易就超出限制,发不出去。短网址服务可以把一个长网址变成短网址,方便在社交网络上传播。
全栈程序员站长
2022/09/02
6.7K0
永久短网址生成 可以永久使用的短链接推荐
短信中的链接为什么那么短?
短网址服务是用于缩短网址,方便用户记忆和访问的一种服务。它通常通过将长网址与短网址服务提供的接口进行匹配,从而实现缩短网址的目的。短网址服务可以降低用户输入长网址时的错误率,提高用户体验,同时也可以减轻服务器的压力,提高网站的访问速度。目前市面上有许多短网址服务,如google的goo.gl、新浪的sina.lt等。
IMWeb前端团队
2018/01/08
6K2
短信中的链接为什么那么短?
挖洞案例-短链接安全之越权
短网址服务可以提供一个非常短小的URL以代替原来的可能较长的URL,将长的URL地址缩短。用户访问缩短后的URL时,通常将会重定向到原来的URL。短网址服务主要起源于一些具有字数限制的微博客服务,但是现在广泛用于短信、邮件等。
用户1467662
2019/11/19
1.6K0
挖洞案例-短链接安全之越权
URL短链接实现方法
最近项目开发中,需要实现URL长链接转短链接的需求,于是在网上找了一些资料,顺便整理了下,欢迎有想法的童鞋踊跃留言,我们共同探讨。 一.短链接的好处 1.内容需要(比如短信,微博中链接字数的限制) 2.便于管理(方便后台跟踪点击量,便于统计) 3.用户友好(看起来很Cool,提升用户体验) 大致思路是定义一个URL映射算法,将长的URL映射到短的URL,使用数据库或者redis缓存存储映射关系,实现映射算法。其中关键部分在于映射算法,接下来我们就详细说下映射算法。 二.映射算法 1.进制转
wangxl
2018/03/09
3.4K0
短URL服务的设计以及实现
想必经常收到这样的短信。短信中的链接一般都是短链接,类似于下图这样,这就是短地址,而
CBeann
2023/12/25
4280
短URL服务的设计以及实现
如何实现一个短链接服务 | 短链接生成原理
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
梦溪
2021/08/09
19.2K3
用Redis实现长链转短链
在生活中有很多场景需要把长链接转化为短连接,比如微博限制字数为140字一条,那么如果我们需要发一些链接上去,但是这个链接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短链接应运而生了。
Lvshen
2022/05/05
8240
用Redis实现长链转短链
短url服务的设计以及实现
最理想的情况是: 我们用一种算法,对每一个长URL,唯一的转换成短URL.还能保持反向转换的能力.
呼延十
2019/06/26
1.2K0
短url服务的设计以及实现
网址太长了难看?生成个短网址吧
所谓短网址就是通过一定的算法把很长的网址得到一个很短的网址,点击这个短网址后会跳转到之前的长网址。
苏生不惑
2020/04/27
13.5K2
相关推荐
​2021-03-25:如何把长url转换为短url?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档