URL缩短器:详细说明

介绍

URL缩短器是一种服务,用于根据非常长的URL创建短链接。通常,短链接的大小为原始URL的三分之一甚至四分之一,这使它们更易于键入,呈现或发布推文。单击短链接用户将自动重定向到原始URL。 

在线提供了许多URL缩短服务,例如tiny.cc,bitly.com,cutt.ly等。实现URL缩短服务并不是一项复杂的任务,并且通常是系统设计访谈的一部分。在这篇文章中,我将尝试解释实现服务的过程。 

理论 

在实施之前,最好以功能和非功能需求的形式写下需要完成的工作。 

功能要求: 

  • 用户需要能够输入长网址。我们的服务应保存该URL并生成一个短链接。

  • 用户应该可以选择输入到期日期。在该日期之后,短链接应该无效。

  • 单击短链接应将用户重定向到原始长URL。

  • 用户应创建一个帐户以使用服务。服务可以有每个用户的使用限制。*

  • 允许用户创建自己的短链接。*

  • 服务应具有指标,例如访问最多的链接。*

非功能需求:

  • 服务应该启动并运行100%的时间。

  • 重定向的持续时间不得超过两秒钟。

*要求是可选的。

网址转换

假设我们要有一个最大长度为7的短链接。URL缩短器中最重要的是转换算法。URL转换可以通过几种不同的方式实现,每种方式各有利弊。 

生成短链接的一种方法是使用某种哈希函数(例如MD5 SHA-2)哈希原始URL 。使用哈希函数时,请确保不同的输入将导致不同的输出。哈希的结果超过七个字符,因此我们需要获取前七个字符。但是,在这种情况下,可能会发生冲突,因为前七个字符可能已经用作短链接。然后,我们采用接下来的七个字符,直到找到未使用的短链接。

生成短链接的第二种方法是使用UUID。UUID将被复制的概率不为零,但它足够接近零而可以忽略不计。由于UUID包含36个字符,这意味着我们遇到了与上述相同的问题。我们应该采用前七个字符,并检查该组合是否已被使用。

第三种方式是将数字从基数10转换为基数62。基数是可用于表示特定数字的数字或字符的数量。以10为基数的数字是[0-9],我们在日常生活中使用的数字是以0为基数的数字[0-9] [az] [AZ]。这意味着,例如,以10为底的四位数数字将以以62为底的相同数字,但带有两个字符。

在URL转换中使用base 62(最大长度为七个字符)使我们可以为短链接提供62 ^ 7个唯一值。

Base 62转换如何工作

我们有一个以10为底的数字,我们想要转换以62为底的数字。我们将使用以下算法:

URL缩短器:详细说明

之后,我们只需要将结果集中的数字映射到以62为基础的字母= [0,1,2,...,a,b,c ...,A,B,C,...]。

让我们用一个真实的例子看看它是如何工作的。在此示例中,让我们将1000从10转换为62。

URL缩短器:详细说明


将[16,8]映射到基数62将是g8。这意味着1000 base10  = g8 base62。

从基础62转换为基础10也很简单:

URL缩短器:详细说明

真实的例子: 

URL缩短器:详细说明

实施

我们将使用数据库的自动增量功能。自动递增的数字将用于以62为基数的转换。你可以使用具有自动增量功能的任何其他数据库。

首先,访问Spring初始化程序,然后选择Spring Web和MySql Driver。之后,单击“ 生成”按钮,然后下载zip文件。解压缩文件并在您喜欢的IDE中打开项目。每次启动新项目时,我都喜欢创建一些文件夹来按逻辑划分代码。在这种情况下,我的文件夹是controllerentityservicerepositorydtoconfig

里面的实体文件夹,让我们创建一个Url.java有四个属性类:idlongUrlcreatedDateexpiresDate。 

请注意,没有短链接属性。我们不会保存短链接。每当有GET请求时,我们就将id属性从10转换为62。这样,我们可以节省数据库空间。

LongUrl属性是我们应该重定向到当一个用户访问一个短链接的URL。创建日期只是为了查看longUrl保存的时间(这并不重要),expiresDate如果用户希望在一段时间后使短链接不可用,那么创建日期就在那里。 

接下来,让我们在服务文件夹中创建BaseService.java。包含从10转换为62的方法,反之亦然。 BaseService

URL缩短器:详细说明

就像我之前提到的,如果要使用基数为62的转换,我们需要有一个基数为62的字母,在这种情况下称为allowedCharacters。另外,base如果我们要更改允许的字符,则从允许的字符的长度计算出变量的值。

encode方法以数字作为输入,并返回短链接。该decode方法将字符串(短链接)作为输入并返回数字。该算法应按照上面的说明进行实施。

然后,在存储库文件夹中,创建一个UrlRepository.java文件,该文件只是的扩展JpaRepository。它为我们提供了许多方法,例如findByIdsave等。我们无需为此添加任何其他内容。 

然后,让我们在controller文件夹中创建一个UrlController.java文件。控制器应具有一种用于创建短链接的POST方法和一种用于重定向至原始URL的GET方法。 

URL缩短器:详细说明

URL缩短器:详细说明

POST方法将UrlLongRequest作为其请求正文。它只是具有longUrlexpiresDate属性的类。

GET方法将短URL作为路径变量,然后获取并重定向到原始URL。在控制器的顶部,UrlService 被注入作为依赖,这将在下面解释。

UrlService.java是大多数逻辑所在的位置,并且是控制器使用的服务。ConvertToShortUrl由控制器的POST方法使用。它只是在数据库中创建一条新记录并获取一个ID。然后将该id转换为以62为基础的短链接,并返回给控制器。 

GetOriginalUrl是控制器的GET方法使用的方法。它首先将字符串转换为以10为底的字符串,其结果是一个id。然后,它通过该ID从数据库中获取一条记录,如果不存在则抛出异常。之后,它将原始URL返回给控制器。 

就是这样。我们已经实现了一切,以提供有效的URL缩短服务!

结论

URL缩短服务是一种简单的服务,它需要较长的URL并将其转换为短链接。访问该链接后,用户将被重定向到原始URL。 

在本文中,我解释了缩短服务背后的理论并展示了如何实现这一点。在下一篇文章中,我将解释一些“高级”功能,例如docker,缓存,数据分区和自动删除过期链接的作业。

有什么问题可以加下qq:2062583349。也可添加vx:admindesire,有java、python、web等习资料和视频课程干货”。欢迎交流!