关于 URL 短链这类问题的思考

大家好,我是晨光,5 年前端开发,现在携程担任高级前端开发。今天聊一聊 url 转为短链接,有一些疑问,也做了一些思考,希望和大家探讨一下~


什么是短链,我们平常收到的一些短信中,会有很短的那种链接,只有一个域名加一串字母的那种链接,就是短链。当我们点击短链,在浏览器中打开,会发现浏览器中的 url 是非常长的,这是什么为什么呢,大家有没有好奇呢。


一、短链的好处


对于用户来说,短链比较简洁,便于传播,方便记忆。


对于开发者来着,短链的字符数少,节约代码行数,增加代码可读性。


当然也有一种情况,比如在某些平台发表内容,会限制字符数,例如最多可输入500字,可能要分享的内容中包含 url,而 url 有450字符,只剩50个字,可能无法描述清楚我们想要表达的观点。


并且这种超长的链接对其他浏览的用户也不友好,假如出现满屏看不懂的字符,肯定会很抓狂。此时采用短链就可以大大节约字符数,用户体验也会更友好。


二、短链的实现方案


昨天查看了大量的资料,都显示,需要服务端做数据支持才可以实现。毕竟我们生成短链的目的还是为了让用户分享和点击,假如服务端没有做类似的缓存,用户访问的时候,肯定会404,因此基于这种情况,需要服务端进行支持。


想要实现一个简单的短链接,很简单,使用随机数什么的就可以实现,但是要考虑到高并发,高稳定,高可靠性,肯定会用到后端存储,至于为什么,晨光考虑的也不是很全面,感兴趣的话,大家也可以思考思考。


具体的生成短链的流程

图片来自稀土掘金


三、字符串压缩


上面讲的是针对 url 做压缩生成短链,接下来想要讨论下有关字符串的压缩。


我们可以把 url 当作普通的字符串,对其进行压缩,还要保证解压后和原来的字符串相同。


应用场景:


h5 或小程序页面跳转,如果 url 超长会被浏览器截断,或直接跳转到 error 页,具体限制的字符数是多少,可能是 2000,3000 或者 5000。为了保证能够正常跳转,可以将 URL 上带的参数进行长度压缩,在使用参数的地方再进行解压。


对于这个点,晨光提出了一些疑问


疑问1:

1、前端这样做的收益有多大

2、假如有1000个人点击了同一个页面,url一样,那么每个用户都会做压缩和解压

3、同一个用户,多次点击同一个链接,也会多次压缩解压这样看下来的话,是不是做在服务端会好一些

:每个用户点都是在自己的设备上实现计算,如果放在服务端,那所有的压力都会在服务端了,所以放在前端做会好一些


疑问2:

假如 1000 个用户点击 1000 个不同的 url,服务器只用做 1000 次计算,每个用户也只用做 1000 次计算,但所有的用户加起来,共计做了1000*1000次压缩和解压,资源是否有些浪费?

:不能这样算呀,这里要考虑的是单个用户的开销和服务器的开销,把多个用户的开销加起来没有意义,而且这样的开销对于用户来说是可以忽略不计的。假如有1000个用户点击同一个页面,那么服务端可能要做1000次压缩和解压


疑问3:

服务端是不是会把计算过的 url 缓存下来,用户再次请求相同的url时,就不用再次压缩和解压,所以是不是 1000 个用户点击同一个页面就其实也是只计算一次。


疑问4:

假如 1000 个用户访问了 1000 个不同的页面,那么服务器其实也还是会做 1000 次压缩和解压,当另外的用户访问时,应该只会做查找工作吧。


疑问 3 和疑问 4 暂时没有答案,感兴趣的小伙伴可以大开脑洞,反正晨光现在是无解的。


四、字符串压缩方案


经过大量的资料搜索,最终确定了 shrink-string 和 pako 这两个包可以使用。


shrink-string 对于越长的字符串压缩效果越明显,较短的字符串压缩后的长度可能比压缩前的长度长。

pako 压缩后的内容为 Unit8Array,尝试了传参,无法转为字符串,但是应该也是可以起到压缩效果的吧。


以上就是今天的内容了,欢迎在评论区交流~

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP