临沂新闻网

首页 > 正文

面试现场:如果让你实现一个短链接服务,你会怎么设计?

www.nk7x.cn2019-08-25

采访者:您是否经常注意到某些垃圾邮件包含短链接?

候选人:是的,就像这样!

记者:

为什么选择这种短链接?

有什么好处?

如果您要实施短链接生成服务,您将如何设计它?

在本文中,我们来谈谈上述问题!

首先,短网址的好处是:

短。短信和许多平台(微博)都有字数限制。如果添加的链接太长,则无法编写文本。

好看。短链接比许多未知参数更简洁和友好。

做一些统计很方便。如果您点击链接,有人会记录并分析它。

安全。不要公开访问参数。

这就是为什么我们现在收到的大多数垃圾邮件都是短网址。

那么短网址如何做呢?

短网址基础知识

从以下步骤使用的生成中生成短URL。

有一项服务会在短网址上向您发送长网址。例如>

发送简短的网址到内容,如短信,然后发送。

用户点击短网址,浏览器会重定向301/302以访问相应的长网址。

显示相应的内容。

那么如何将长URL映射到短URL?

服务设计

如果你考虑长URL和短URL之间的真实对应关系,那么就去吧。

最理想的情况:我们使用算法将每个长URL唯一地转换为短URL。它还保持逆转换的能力。

但这是不可能的。如果有这样的算法,世界上所有的压缩算法都可以就位。

正确的想法是创建一个自动收报机。每当有新的长URL进入时,我们添加一个并返回新值。第一个url返回'',第二个url返回''。/P>

如何存储通信?

这个相应的数据必须放在磁盘上,每次重启系统都不能重新注册,这样就可以使用mysql和其他数据库来存储。并且如果数据量很小且qps很低,则可以直接使用数据库的自增量主键来实现。/P>

如何确保长链接和短链接之间的一对一对应?

根据上述发行者策略,不能保证长链路和短链路之间的一对一对应关系。您使用相同的URL连续请求两次,结果值不同。

为了在长链接和短链接之间实现一对一的对应,我们需要付出很多空间,特别是对于快速响应,我们可能需要在内存中做一层缓存,这太浪费了。

但是,可以实现一些变体以实现部分一对一的对应关系,例如在K-V数据库中存储最新/最流行的对应关系,这可以节省空间并加快响应速度。

短网址存储

我们返回的短网址通常会转换为32位数,这样可以更有效地缩短网址长度

然后32位数字只是计算机的一个字符串。如何存放?直接存储字符串以找到等效值对于范围搜索来说太不友好了。

实际上,您可以直接存储十进制数字,这不仅占用更少的空间,而且还支持搜索。转换为更多/更少的十六进制代码以进一步缩短URL也更方便。

高并发性

如果它直接存储在MySQL中,当并发请求增加时,数据库上的压力太大,这可能会导致瓶颈。目前,可能会有一些优化。

高速缓存

以上保证了一对一的通信中也提到了长链接和短链接。在这里,我们将加快程序的处理。

您可以缓存流行的长链接(需要导入长链接的次数),最近的长链接(可以使用redis保存最后一小时)等,并将它们存储在内存或内存数据库中像redis。/P>

如果请求的长URL到达缓存,则直接检索并返回相应的短URL,无需执行构建操作。

批号

每次发送PIN时,都需要访问MySQL以获取当前的最大数量,并在获取后更新最大数量。这种压力相对较大。

我们每次都可以从数据库中获取一个数字,然后在内存中发出它。当剩余数量小于1000时,我们将重新请求MySQL的下一个数字。在分发了最后一批数字后,批量写入。

这样可以将数据库的连续操作移动到代码中,并进行异步获取和写入操作,以确保服务继续保持高并发性。

分布式

上面设计的系统只有一个点,即编号设备是单点,易于挂起。

可以使用分布式服务。如果分发,如果每个发件人在发送号码后需要与其他发件人同步,则可能不会太麻烦。

另一个想法是,你可以有两个编号设备,一个发行号码和一个双号码。发送号码后,它不再增加1,而是增加2。

比喻可用,我们可以分别使用1000个服务,发出0-999个号码,每个号码后递增1000个。这很简单,服务基本上不需要彼此沟通,做自己的事情。

实施

因为我懒得编写JDBC代码,所以我更懒于获取Mybatis,因此在代码中使用MySQL的地方使用Redis。

最后,分享一本采访书[Java核心知识点整理]涵盖JVM,锁定,高并发,反射,Spring原理,微服务,Zookeeper,数据库,数据结构等“,以及Java208面试问题(带答案)加入我的粉丝团(Java Fill Road :)免费获得它!掌握这些知识点,你可以在面试中赢得很多候选人,暴击9999分。机会留给准备人员,只有充分的准备,可以让自己在候选人中脱颖而出。

Java技术剑

0.1

2019.08.03 14: 47

字数1640

采访者:您是否经常注意到某些垃圾邮件包含短链接?

候选人:是的,就像这样!

记者:

为什么选择这种短链接?

有什么好处?

如果您要实施短链接生成服务,您将如何设计它?

在本文中,我们来谈谈上述问题!

首先,短网址的好处是:

短。短信和许多平台(微博)都有字数限制。如果添加的链接太长,则无法编写文本。

好看。短链接比许多未知参数更简洁和友好。

做一些统计很方便。如果您点击链接,有人会记录并分析它。

安全。不要公开访问参数。

这就是为什么我们现在收到的大多数垃圾邮件都是短网址。

那么短网址如何做呢?

短网址基础知识

从以下步骤使用的生成中生成短URL。

有一项服务会在短网址上向您发送长网址。例如>

发送简短的网址到内容,如短信,然后发送。

用户点击短网址,浏览器会重定向301/302以访问相应的长网址。

显示相应的内容。

那么如何将长URL映射到短URL?

服务设计

如果你考虑长URL和短URL之间的真实对应关系,那么就去吧。

最理想的情况:我们使用算法将每个长URL唯一地转换为短URL。它还保持逆转换的能力。

但这是不可能的。如果有这样的算法,世界上所有的压缩算法都可以就位。

正确的想法是创建一个自动收报机。每当有新的长URL进入时,我们添加一个并返回新值。第一个url返回'',第二个url返回''。/P>

如何存储通信?

这个相应的数据必须放在磁盘上,每次重启系统都不能重新注册,这样就可以使用mysql和其他数据库来存储。并且如果数据量很小且qps很低,则可以直接使用数据库的自增量主键来实现。/P>

如何确保长链接和短链接之间的一对一对应?

根据上述发行者策略,不能保证长链路和短链路之间的一对一对应关系。您使用相同的URL连续请求两次,结果值不同。

为了在长链接和短链接之间实现一对一的对应,我们需要付出很多空间,特别是对于快速响应,我们可能需要在内存中做一层缓存,这太浪费了。

但是,可以实现一些变体以实现部分一对一的对应关系,例如在K-V数据库中存储最新/最流行的对应关系,这可以节省空间并加快响应速度。

短网址存储

我们返回的短网址通常会转换为32位数,这样可以更有效地缩短网址长度

然后32位数字只是计算机的一个字符串。如何存放?直接存储字符串以找到等效值对于范围搜索来说太不友好了。

实际上,您可以直接存储十进制数字,这不仅占用更少的空间,而且还支持搜索。转换为更多/更少的十六进制代码以进一步缩短URL也更方便。

高并发性

如果它直接存储在MySQL中,当并发请求增加时,数据库上的压力太大,这可能会导致瓶颈。目前,可能会有一些优化。高速缓存

以上保证了一对一的通信中也提到了长链接和短链接。在这里,我们将加快程序的处理。

您可以缓存流行的长链接(需要导入长链接的次数),最近的长链接(可以使用redis保存最后一小时)等,并将它们存储在内存或内存数据库中像redis。/P>

如果请求的长URL到达缓存,则直接检索并返回相应的短URL,无需执行构建操作。

批号

每次发送PIN时,都需要访问MySQL以获取当前的最大数量,并在获取后更新最大数量。这种压力相对较大。

我们每次都可以从数据库中获取一个数字,然后在内存中发出它。当剩余数量小于1000时,我们将重新请求MySQL的下一个数字。在分发了最后一批数字后,批量写入。

这样可以将数据库的连续操作移动到代码中,并进行异步获取和写入操作,以确保服务继续保持高并发性。

分布式

上面设计的系统只有一个点,即编号设备是单点,易于挂起。

可以使用分布式服务。如果分发,如果每个发件人在发送号码后需要与其他发件人同步,则可能不会太麻烦。

另一个想法是,你可以有两个编号设备,一个发行号码和一个双号码。发送号码后,它不再增加1,而是增加2。

比喻可用,我们可以分别使用1000个服务,发出0-999个号码,每个号码后递增1000个。这很简单,服务基本上不需要彼此沟通,做自己的事情。

实施

因为我懒得编写JDBC代码,所以我更懒于获取Mybatis,因此在代码中使用MySQL的地方使用Redis。

最后,分享一本采访书[Java核心知识点整理]涵盖JVM,锁定,高并发,反射,Spring原理,微服务,Zookeeper,数据库,数据结构等“,以及Java208面试问题(带答案)加入我的粉丝团(Java Fill Road :)免费获得它!掌握这些知识点,你可以在面试中赢得很多候选人,暴击9999分。机会留给准备人员,只有充分的准备,可以让自己在候选人中脱颖而出。

采访者:您是否经常注意到某些垃圾邮件包含短链接?

候选人:是的,就像这样!

记者:

为什么选择这种短链接?

有什么好处?

如果您要实施短链接生成服务,您将如何设计它?

在本文中,我们来谈谈上述问题!

首先,短网址的好处是:

短。短信和许多平台(微博)都有字数限制。如果添加的链接太长,则无法编写文本。

好看。短链接比许多未知参数更简洁和友好。

做一些统计很方便。如果您点击链接,有人会记录并分析它。

安全。不要公开访问参数。

这就是为什么我们现在收到的大多数垃圾邮件都是短网址。

那么短网址如何做呢?

短网址基础知识

从以下步骤使用的生成中生成短URL。

有一项服务会在短网址上向您发送长网址。例如>

发送简短的网址到内容,如短信,然后发送。

用户点击短网址,浏览器会重定向301/302以访问相应的长网址。

显示相应的内容。

那么如何将长URL映射到短URL?

服务设计

如果你考虑长URL和短URL之间的真实对应关系,那么就去吧。

最理想的情况:我们使用算法将每个长URL唯一地转换为短URL。它还保持逆转换的能力。

但这是不可能的。如果有这样的算法,世界上所有的压缩算法都可以就位。

正确的想法是创建一个自动收报机。每当有新的长URL进入时,我们添加一个并返回新值。第一个url返回'',第二个url返回''。/P>

如何存储通信?

这个相应的数据必须放在磁盘上,每次重启系统都不能重新注册,这样就可以使用mysql和其他数据库来存储。并且如果数据量很小且qps很低,则可以直接使用数据库的自增量主键来实现。/P>

如何确保长链接和短链接之间的一对一对应?

根据上述发行者策略,不能保证长链路和短链路之间的一对一对应关系。您使用相同的URL连续请求两次,结果值不同。

为了实现长链路和短链路之间的一对一对应,我们需要付出很多空间,特别是对于快速响应,我们可能需要在内存中做一层缓存,这太浪费了。

但是,可以实现一些变体以实现部分一对一的对应关系,例如在K-V数据库中存储最新/最流行的对应关系,这可以节省空间并加快响应速度。

短网址存储

我们返回的短网址通常会转换为32位数,这样可以更有效地缩短网址长度

然后32位数字只是计算机的一个字符串。如何存放?直接存储字符串以找到等效值对于范围搜索来说太不友好了。

实际上,您可以直接存储十进制数字,这不仅占用更少的空间,而且还支持搜索。转换为更多/更少的十六进制代码以进一步缩短URL也更方便。

高并发性

如果它直接存储在MySQL中,当并发请求增加时,数据库上的压力太大,这可能会导致瓶颈。目前,可能会有一些优化。

高速缓存

以上保证了一对一的通信中也提到了长链接和短链接。在这里,我们将加快程序的处理。

您可以缓存流行的长链接(需要导入长链接的次数),最近的长链接(可以使用redis保存最后一小时)等,并将它们存储在内存或内存数据库中像redis。/P>

如果请求的长URL到达缓存,则直接检索并返回相应的短URL,无需执行构建操作。

批号

每次发送PIN时,都需要访问MySQL以获取当前的最大数量,并在获取后更新最大数量。这种压力相对较大。

我们每次都可以从数据库中获取一个数字,然后在内存中发出它。当剩余数量小于1000时,我们将重新请求MySQL的下一个数字。在分发了最后一批数字后,批量写入。

这样可以将数据库的连续操作移动到代码中,并进行异步获取和写入操作,以确保服务继续保持高并发性。

分布式

上面设计的系统只有一个点,即编号设备是单点,易于挂起。

可以使用分布式服务。如果分发,如果每个发件人在发送号码后需要与其他发件人同步,则可能不会太麻烦。

另一个想法是,你可以有两个编号设备,一个发行号码和一个双号码。发送号码后,它不再增加1,而是增加2。

比喻可用,我们可以分别使用1000个服务,发出0-999个号码,每个号码后递增1000个。这很简单,服务基本上不需要彼此沟通,做自己的事情。

实施

因为我懒得编写JDBC代码,所以我更懒于获取Mybatis,因此在代码中使用MySQL的地方使用Redis。

最后,分享一本采访书[Java核心知识点整理]涵盖JVM,锁定,高并发,反射,Spring原理,微服务,Zookeeper,数据库,数据结构等“,以及Java208面试问题(带答案)加入我的粉丝团(Java Fill Road :)免费获得它!掌握这些知识点,你可以在面试中赢得很多候选人,暴击9999分。机会留给准备人员,只有充分的准备,可以让自己在候选人中脱颖而出。

热门浏览
热门排行榜
热门标签
日期归档