长链接问题:
复制容易出错,长链接URL较长,有时参数不止一个,复制容易遗漏或在粘贴时被编辑器截断;
容易被屏蔽,绝大部分长链接暴露了资源来源及分配策略,在投放第三方时容易被屏蔽,比如被短信屏蔽,(淘宝宝贝长链接)被微信屏蔽......;
反例:
因此,我们考虑短链接服务对长链接进行压缩,跳转替代!
1、用户访问短链接: https://0x9.me/QvjlI ;
2、短链接服务器0x9.me收到请求,根据路径参数QvjlI获取到原始链接:
http://www.dazhongkanche.com/daogou/20200914/64294.html
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对重定向的影响: https://www.batmanit.com/p/457.html
2、有投放就必然涉及到投放资源、渠道、及效果的管理:
资源管理,比如说文章;
渠道管理,比如:微信渠道(公号、朋友圈、运营人员个人私聊)、QQ、微博、短信、头条.....
投放效果统计,针对文章的效果统计(各文章的效果如何?),针对渠道的效果统计(各渠道的效果如何?),针对文章&渠道的效果统计(即不同文章在不同渠道的效果如何?)
3、 一切为了营收!如何从推广短信链接唤起 App ?
4、 如果教你设计一个 短 链接 系统,你会从那些方面来提高性能呢?
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于 TCP/IP 协议,数据传输之前,双方通过“ 三次握手 ”建立连接,当数据传输完成之后,又通过“ 四次挥手 ”释放连接,以下是“三次握手”与“四次挥手”示意图:
三次握手建立连接示意图:
四次挥手释放连接示意图:
长、短连接是相对通信时间而言的。长连接相对短连接而言,多了一个 保持连接 的过程,可以在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。
短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次请求就完成了。这时候双方任意都可以发起close操作,不过一般都是client先发起close操作。上述可知,短连接一般只会在 client/server间传递一次请求操作。
短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。
长连接的操作步骤是:
建立连接——数据传输…(保持连接)…数据传输——关闭连接
client向server发起连接,server接受client连接,双方建立连接,client与server完成一次请求后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。
TCP长连接保持的两种办法:
自定义心跳消息头.,一般客户端主动发送到服务端,服务器接收后进行回应(也可以不回应),以便能够侦测连接是否异常断开。
通过设置TCP keepalive的属性,并设置发送底层心跳包的时间间隔。TCP keepalive是在底层定时发送心跳报文,服务器端接收到底层的心跳报文直接丢弃,不关心其内容。
HTTP协议是无状态的,在HTTP/1.0中默认使用短连接,客户端和服务器每进行一次HTTP操作,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性,使用长连接的HTTP协议,会在响应头加入这行代码:
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
基于TCP/IP协议,我们可以知道,频繁的连接创建和销毁都需要消耗资源,而连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接进行访问,这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。
以数据库连接池为例,基本原理如下:
连接池技术带来的好处:
由于连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及临时进程/线程的数量)。
连接池在初始化过程中,往往已经创建了若干连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
在较为完备的连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规连接操作中可能出现的资源泄漏。
以PHP开发为例,基于PHP-FPM机制实现的Web服务,并不容易实现连接池,而常驻内存的开发框架,例如workerman、swoole 则可以简单实现连接池功能。PHP-FPM机制下的连接池需要借助第三方Proxy实现,例如:
使用短链接的好处: 短、字符少、美观、便于发布、传播
比如我的个人博客地址: http://will-johnson.gitee.io/blog/
使用百度短网址服务转换为短网址为: https://dwz.cn/Eps6teX5
当在浏览器输入短网址回车时,会有一个302跳转。然后浏览器重新访问location地址
对于302多余的解释
302 Found,Moved Temporarily,可以简单的理解为该资源原本确实存在,但已经被 临时 改变了位置;换而言之,就是请求的资源暂时驻留在不同的URI下
对于服务器,通常会给浏览器发送 HTTP Location 头部来重定向到新的新位置,然后浏览器重新加载该Location
HTTP Location 是在两种情况下,因来自 HTTP 服务器的响应中返回 头域 :1.要求网页浏览器加载其他网页( 域名转址 )
短链接的原理其实就是:
发号器 (ID自增)+ 62进制编码
如对于我的博客地址: http://will-johnson.gitee.io/blog/ ,发号16进制:816e351d15bf,转换为62进制即为:Eps6teX5
为什么要用62进制转换
但是如何实现一个长地址多次转换都是同一个短地址呢?
这个不能完全做到。如果想要完全做到,那么就需要保存长地址到短地址的映射关系,得不偿失。
可以采取一个折中的方案,采用有有效时间的kv存储,也就是一个缓存系统。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)