系统方案-设计一个URL短链服务
短链接,通俗的说就是通过程序计算的方式,将一个长URL转换成一个短URL字符串。
微博和推特都有140字的限制。如果分享一个很长的网站,很容易超过限制。
营销短信,字数限制,字数过长时:1。不漂亮;2.超出字符额外收费。
当生成的二维码原始链接过长时,生成的二维码过于复杂,导致一些低像素的手机无法扫描。
功能要求:
非功能性需求:
扩展要求:
REST API可用于公开我们服务的功能。以下可能是用于创建和删除URL的API的定义:
createURL (api_dev_key,original_url,custom_alias=None,user_name=None,expire_date=None)
参数:
Api_dev_key(string):注册账户的Api开发者密钥。其中,这将用于根据分配的配额限制用户。
Original_url (string):要缩短的原始url。
custom _ alias(string):URL的可选自定义键。
User_name (string):编码中使用的可选用户名。
Expire_date (string):缩短URL的可选到期日期。
返回:(字符串)
成功插入将返回一个缩短的URL;否则,它将返回一个错误代码。
删除URL (api_dev_key,url_key)
其中“url_key”是表示要检索的缩短的url的字符串;成功删除将返回“已删除的URL”。
如何发现和预防虐待?恶意用户可以通过使用当前设计中的所有URL键使我们破产。为了防止滥用,我们可以通过用户的api_dev_key来限制用户。每个api_dev_key可以被限制为在每个时间段内创建和重定向特定数量的URL(每个开发者键可以被设置为不同的持续时间)。
结合存储数据的设计:
数据库架构:
我们需要两个表:一个用于存储关于URL映射的信息,另一个用于创建短链接的用户数据。
应该使用什么样的数据库?因为我们期望存储数十亿行,并且我们不需要使用对象之间的关系——NoSQL选择更容易扩展。
在第1节的示例中,缩短的URL是“https://tinyurl.com/vzet59pa”。这个URL的最后八个字符组成了我们想要生成的短链。下面讨论两种解决方案:抽象算法和自增序列算法。
方案1:摘要算法
这个算法,虽然会产生四个,但还是有重复的概率。
方案2:自增序列算法
设置id自动增加,一个十进制id对应一个62位数值,一对一,不会出现重复。这利用了当低等级系统转换为高等级系统时字符数量将减少的特征。
第一种算法的优点是简单易懂,不重复。然而,短码的长度不是固定的,并且随着id变大而从一位长度增加。如果您必须固定短代码长度,您可以从指定的数字开始增加id。百度短网址使用的这个算法。
为了扩展我们的数据库,我们需要对它进行分区,以便它可以存储关于数十亿个URL的信息。因此,我们需要开发一个分区方案,将我们的数据划分并存储在不同的数据库服务器中。
基于范围的分区:我们可以根据哈希键的第一个字母将URL存储在单独的分区中。因此,我们将所有以字母“A”(和“A”)开头的URL哈希键保存在一个分区中,以字母“B”开头的保存在另一个分区中,以此类推。这种方法称为基于范围的分区。我们甚至可以将一些不常用的字母组合成一个数据库分区。因此,我们应该开发一个静态分区方案,总是以一种可预测的方式存储/查找URL。
这种方法的主要问题是可能会导致数据库服务器的不平衡。例如,我们决定将所有以字母“E”开头的URL放入DB分区,但是后来我们意识到以字母“E”开头的URL太多了。
另一种基于散列的分区:在这种方案中,我们得到我们存储的对象的散列。然后我们根据散列计算要使用的分区。在我们的示例中,我们可以使用“key”或短链接的哈希值来确定存储数据对象的分区。
我们的哈希函数将URL随机分配到不同的分区(例如,我们的哈希函数总是可以将任何“键”映射到[1…256]之间的数字)。这个数字将代表我们存储对象的分区。
这种方法仍然会导致分区过载,这可以通过使用一致散列来解决。
您可以缓存经常访问的URL。结合Memcached、redis等缓存中间件,可以存储完整的URL及其各自的哈希值。因此,应用服务器可以在访问后端存储之前快速检查缓存是否具有所需的URL。
我们应该有多少高速缓冲存储器?我们可以从20%的每日流量开始,我们可以根据客户的使用模式调整我们需要多少缓存服务器。如上所述,我们需要170GB的内存来缓存20%的日常流量。由于现代服务器可以有256GB的内存,我们可以很容易地将所有缓存放在一台机器上。或者,我们可以使用几个较小的服务器来存储所有这些流行的网址。
哪种缓存回收策略最符合我们的需求?当缓存满了,我们想用一个更新/更热的URL替换这个链接,我们该如何选择?最近最少使用(LRU)可能是我们系统的合理策略。根据这个策略,最近最少使用的URL将首先被丢弃,并且可以使用链接的哈希映射或类似的数据结构来存储我们的URL和哈希,这也将跟踪最近访问的URL。
如何更新每个缓存副本?每当缓存未命中时,我们的服务器将访问后端数据库。每当这种情况发生时,我们可以更新缓存并将新条目传递给所有缓存副本。每个副本可以通过添加新条目来更新其缓存。如果副本已经有这个条目,它可以简单地忽略它。
我们可以在系统的三个位置添加负载平衡层:
条目应该永远存在,还是应该清除?如果到了用户指定的过期时间,链接会发生什么情况?
如果我们选择继续搜索过期链接来删除它们,会给我们的数据库带来很大的压力。而是可以慢慢删除过期链接,做懒清理。我们的服务将确保只有过期的链接被删除。
用户可以创建私有URL或允许特定用户组访问URL吗?
您可以将每个URL的权限级别(公共/私有)存储在数据库中,也可以创建一个单独的表来存储有权查看特定URL的UserID。如果用户没有权限并试图访问该URL,则会返回一个错误(HTTP 401)。假设我们将数据存储在像Cassandra这样的NoSQL宽列数据库中,那么表存储权限的密钥将是“hash”(或者由KGS生成的“key”)。这些列将存储那些有权查看URL的用户的用户id。
知网url指的是什么?
意思是指知网的统一资源定位地址。
URL一词是Uniform ResourceLocator(统一资源定位符)的字头缩写。在Internet工程任务组(InternetEngineering Task Force,缩写为:IETF)中,通常将URL设计为Internet站点寻址的标准代码。一个URL类似于物理的树型地址;它是一列简单的代码,直接指向Internet上的一个特殊站点或模型。一个URL由2~5段组成,每一段以一个特殊字符隔开
url与ip地址区别?
url
URL(Uniform Resource Locator: 统一资源定位符),通俗地来说就是WWW页的地址。更准确的说法是统一资源定位符是对可从互联网上得到的资源的位置和访问方法的一种简洁表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
ip地址
IP地址也可以称为互联网地址或Internet地址。是用来唯一标识互联网上计算机的逻辑地址。每台连网计算机都依靠IP地址来标识自己。就很类似于电话号码样的,通过电话号码来找到相应的电话,全世界的电话号码都是唯一的,IP地址也是一样。
制作网页怎么做内部链接?
选择“插入”菜单的“超链接”命令,在文件列表框内选择“页面1.htm”文件,注意在URL文本框中显示了该文件的地址。单击“确定”按钮.超链接就制作成功了。我们切换到预览模式(单击预览按钮),当我们把鼠标指向“主页”两字时鼠标变成手形,单击它,我们就切换到主页了。r我们也可以将超链接指向其他站点的网页。选中作为超链接的文本,单击“常用”工具栏的“超链接”按钮,这和选择插入菜单的超链接命令是一样的。在“创建超链接”对话框里,在URL地址栏直接输入要连接的网页或网站的地址。如果不清楚要作超链接的地址,只要单击URL地址框后面的放大镜就可以用浏览器在INTERNET上查找要链接的网页,FRONTPAGE会自动记录你找到的地址。单击“确定”按钮就可以了。我们还可以改变已经设置好的超链接。首先确认是普通模式,在要改变的超链接下单击鼠标右键,选择“超链接属性”命令,输入新的URL地址就可以了。要想取消超链接,删除所有URL地址框里的内容就可以了。r还有一种超链接,可以链接电子邮件。这样可以使你的网上朋友通过Email及时与你联系,这是一个网站站长和网友交流的重要手段。先选中要作为超链接的文本,一般文本就是你的邮箱地址,单击“超链接”按钮,单击“信封”按钮,输入你的邮箱地址,单击“确定”按钮,退出对话框,选择“确定”,这时超链接就建立好了。我们试一下,切换到预览模式,单击邮件链接。
IP地址,URL,网址有什么关系?
IP地址是每一个连接网络的主机都需要的!它唯一的代表网络上的一个设备的逻辑位置!它将是互联网寻址传送数据的关键!它就像我们的地址一样!
URL是通用资源定位器,是用来标识网络中的资源的符号,资源包括文件,图片,视频,音频等!
网址是指网页的地址,比如www.baidu.com 他就是一个网址,我们打开网页时候都是需要类似的网址的。即便是你点击和某个导航网页上的地址也是需要网址的,只是输入变成了自动而已!
这三个都是标识地址,只是IP地址更底层一些,网址最终也会被转换为对应的IP地址来访问,网址只是方便我们记忆一个网站的地址而使用的,我们用IP地址也是可以直接访问的!而URL其实包括网址和其他的协议地址,只是现在大部分情况下U5RL可以等同于网址!