重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
关键词:长链接;短链接;重定向;
创新互联专注于淮滨网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供淮滨营销型网站建设,淮滨网站制作、淮滨网页设计、淮滨网站官网定制、小程序制作服务,打造淮滨网络公司原创品牌,更为您提供淮滨网站排名全网营销落地服务。
长链接问题:
复制容易出错,长链接URL较长,有时参数不止一个,复制容易遗漏或在粘贴时被编辑器截断;
容易被屏蔽,绝大部分长链接暴露了资源来源及分配策略,在投放第三方时容易被屏蔽,比如被短信屏蔽,(淘宝宝贝长链接)被微信屏蔽......;
反例:
因此,我们考虑短链接服务对长链接进行压缩,跳转替代!
1、用户访问短链接: ;
2、短链接服务器0x9.me收到请求,根据路径参数QvjlI获取到原始链接:
3、服务器返回301/302状态码,将响应头中的Location设置为 原始链接;
4、浏览器重定向到原始链接;
5、返回响应;
短链接生成:
1、库表设计:id、code(短链码)、url(原链接),采用Key-Value方式对应存储
2、短链码
1)、存储方式:62进制,每位 可选 a-z、A-Z 和 0-9 等62个字符,比通常的数字方式存储量大。注:
4位就可以表征 62^4 = 1477,6336 约 1500万条数据;
5位可以表征 62^5 = 9,16132832 约 9亿条数据;
6位可以表征 62^6 = 568,00235584 约 560亿条数据;
例子:
通过短链码的长度,可以判断得出各平台服务板块的历史业务量,如上:
【菜鸟驿站】同【拼多多】,采用了8位短链码,62^8 = 218,3401,05584896,业务量都累积到了多少万亿级别。
另,值得关注,点击拼多多的链接直接打开APP(具体技术方案参考: 如何从推广短信链接唤起 App ),优于绝大部分应用的推广。
2)、生成方式:可以按ID自增序列(自增后10到62进制转换)、哈希算法方式生成,可参考: 如果教你设计一个 短 链接 系统,你会从那些方面来提高性能呢?
重定向性能考虑:
1、301、302跳转区别:
1)、301跳转,永久重定向,默认被浏览器缓存,只要访问过一次短链,后续都会直接跳转原链地址,不经过服务器;
2)、302跳转,临时重定向,不被浏览器缓存,每次都经过短链接服务器;
所以,要想实现短链更灵活的资源跳转配置,采用302跳转就比较合适,缺点是:对搜索引擎不友好+性能问题(每次都要过短链服务);考虑到SEO+访问性能(浏览器缓存解决),建议采用301跳转方式。
2、通过Redis做查询表,短链Code 映射长链接Url;
3、防机器人脚本访问,结合白名单等机制;
注:作为对外开放的短链服务对设计要求更高,完全作为一个独立系统进行设计。
注:本当章节下所有内容的撰写思路与方式:
1、针对指定资源手动生成短链接,进行投放;
2、针对指定资源,批量生成短链接,并形成记录,以便进行投放;
3、在一些环节(如:短信投放、微信分享时),自动生成短链接(用户无感)完成投放;
介绍如何应用场景:
1、朋友圈消息:
2、微信/QQ群插件自动发送链接
微信,空间节约效果良好:
常用的QQ群自动回复插件:
3、短信营销
优点:
1、在链接投放时,方便复制粘贴;
2、短网址使排版变的美观,简洁,用户关注的重点在文案上面;
3、防止屏蔽,如短信屏蔽、微信屏蔽....;
4、访问资源有效期控制,添加密码等:
原则上可以在跳转之前做任何后端想做的事情,比如访问统计,比如后续访问链接的切换,所以对访问资源的可控性就比较强,
举例:跳转资源不稳定,今天是A,明天是B,就可以通过修改原链接实现跳转资源的切换。
关联技术的延展介绍
1、301对重定向的影响:
2、有投放就必然涉及到投放资源、渠道、及效果的管理:
资源管理,比如说文章;
渠道管理,比如:微信渠道(公号、朋友圈、运营人员个人私聊)、QQ、微博、短信、头条.....
投放效果统计,针对文章的效果统计(各文章的效果如何?),针对渠道的效果统计(各渠道的效果如何?),针对文章渠道的效果统计(即不同文章在不同渠道的效果如何?)
3、 一切为了营收!如何从推广短信链接唤起 App ?
4、 如果教你设计一个 短 链接 系统,你会从那些方面来提高性能呢?
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
虽然NoSQL流行语火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动。尽管早期的堆栈代码只能算是一种实验,然而现在的系统已经更加的成熟、稳定。不过现在也面临着一个严酷的事实:技术越来越成熟——以至于原来很好的NoSQL数据存储不得不进行重写,也有少数人认为这就是所谓的2.0版本。这里列出一些比较知名的工具,可以为大数据建立快速、可扩展的存储库。
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
对于NoSQL并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征:
不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。
无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。
弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。
分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。
异步复制:和RAID存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据。
BASE:相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。
NoSQL数据库并没有一个统一的架构,两种NoSQL数据库之间的不同,甚至远远超过两种关系型数据库的不同。可以说,NoSQL各有所长,成功的NoSQL必然特别适用于某些场合或者某些应用,在这些场合中会远远胜过关系型数据库和其他的NoSQL。
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
微博和Twitter都有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(字符串):要缩短的原始 URL。
custom_alias(字符串):URL 的可选自定义键。
user_name(字符串):在编码中使用的可选用户名。
expire_date (string): 缩短 URL 的可选过期日期。
返回 :(字符串)
成功插入会返回缩短的 URL;否则,它会返回错误代码。
deleteURL (api_dev_key, url_key)
其中“url_key”是一个字符串,表示要检索的缩短的 URL;成功删除会返回“已删除 URL”。
如何发现和防止滥用?恶意用户可以通过使用当前设计中的所有 URL 密钥使我们破产。为了防止滥用,我们可以通过他们的 api_dev_key 限制用户。每个 api_dev_key 可以限制为每个时间段内特定数量的 URL 创建和重定向(每个开发者密钥可以设置为不同的持续时间)。
结合储存数据设计:
数据库架构:
我们需要两张表:一张用于存储有关 URL 映射的信息,另一张用于创建短链接的用户数据。
应该使用什么样的数据库?由于我们预计存储数十亿行,并且我们不需要使用对象之间的关系——NoSQL 选择更容易扩展
在第 1 节的示例中,缩短的 URL 是“”。这个 URL 的最后八个字符构成了我们要生成的短链。讨论以下两种解决方案: 摘要算法、自增序列算法
方案一:摘要算法
这种算法,虽然会生成4个,但是仍然存在重复几率
方案二: 自增序列算法
设置 id 自增,一个 10进制 id 对应一个 62进制的数值,1对1,也就不会出现重复的情况。这个利用的就是低进制转化为高进制时,字符数会减少的特性。
第一种算法的好处就是简单好理解,永不重复。但是短码的长度不固定,随着 id 变大从一位长度开始递增。如果非要让短码长度固定也可以就是让 id 从指定的数字开始递增就可以了。百度短网址用的这种算法。
为了扩展我们的数据库,我们需要对其进行分区,以便它可以存储有关数十亿个 URL 的信息。因此,我们需要开发一种分区方案,将我们的数据划分并存储到不同的数据库服务器中。
一个基于范围的分区: 我们可以根据哈希键的第一个字母将 URL 存储在单独的分区中。因此,我们将所有以字母“A”(和“a”)开头的 URL 哈希键保存在一个分区中,将那些以字母“B”开头的 URL 哈希键保存在另一个分区中,依此类推。这种方法称为基于范围的分区。我们甚至可以将某些不太频繁出现的字母组合到一个数据库分区中。因此,我们应该开发一种静态分区方案,以始终以可预测的方式存储/查找 URL。
这种方法的主要问题是它可能导致数据库服务器不平衡。例如,我们决定将所有以字母“E”开头的 URL 放入 DB 分区,但后来我们意识到我们有太多以字母“E”开头的 URL。
另外基于散列的分区: 在这个方案中,我们获取我们正在存储的对象的散列。然后我们根据哈希计算要使用的分区。在我们的例子中,我们可以使用“键”或短链接的哈希值来确定我们存储数据对象的分区。
我们的散列函数会将 URL 随机分布到不同的分区中(例如,我们的散列函数总是可以将任何“键”映射到 [1…256] 之间的数字)。这个数字将代表我们存储对象的分区。
这种方法仍然会导致分区过载,这可以使用一致哈希解决。
可以缓存经常访问的 URL,结合缓存中间件例如 Memcached、redis,它可以存储完整的 URL 及其各自的哈希值。因此,应用服务器在访问后端存储之前,可以快速检查缓存是否具有所需的 URL。
我们应该有多少缓存内存? 我们可以从每天 20% 的流量开始,根据客户的使用模式,我们可以调整我们需要多少缓存服务器。如上所述,我们需要 170GB 的内存来缓存 20% 的日常流量。由于现代服务器可以拥有 256GB 内存,我们可以轻松地将所有缓存放入一台机器中。或者,我们可以使用几个较小的服务器来存储所有这些热门 URL。
哪种缓存驱逐策略最适合我们的需求? 当缓存已满,并且我们想用更新/更热的 URL 替换链接时,我们将如何选择?最近最少使用 (LRU) 可能是我们系统的合理策略。根据此政策,会首先丢弃最近最少使用的 URL,可以使用 Linked Hash Map 或类似的数据结构来存储我们的 URL 和哈希,这也将跟踪最近访问过的 URL。
如何更新每个缓存副本? 每当缓存未命中时,我们的服务器就会访问后端数据库。每当发生这种情况时,我们都可以更新缓存并将新条目传递给所有缓存副本。每个副本都可以通过添加新条目来更新其缓存。如果副本已经有该条目,它可以简单地忽略它。
我们可以在系统的三个地方添加负载均衡层:
条目应该永远存在,还是应该被清除?如果达到用户指定的过期时间,链接会发生什么?
如果我们选择不断搜索过期链接来删除它们,这会给我们的数据库带来很大的压力。相反,我们可以慢慢删除过期链接并进行惰性清理。我们的服务会确保只删除过期的链接。
用户能否创建私有 URL 或允许一组特定用户访问 URL?
可以将权限级别(公共/私有)与数据库中的每个 URL 一起存储,还可以创建一个单独的表来存储有权查看特定 URL 的 UserID。如果用户没有权限并尝试访问 URL,可以发回错误 (HTTP 401)。鉴于我们将数据存储在像 Cassandra 这样的 NoSQL 宽列数据库中,表存储权限的键将是“哈希”(或 KGS 生成的“键”)。这些列将存储那些有权查看 URL 的用户的用户 ID。