16

聊聊短地址服务的实现 | 萌叔

 4 years ago
source link: http://vearne.cc/archives/39248?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

聊聊短地址服务的实现

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://vearne.cc

一个长URL地址,形如”https://www.google.com.hk/search?q=%E7%9F%AD%E5%9C%B0%E5%9D%80%E6%9C%8D%E5%8A%A1&oq=%E7%9F%AD%E5%9C%B0%E5%9D%80%E6%9C%8D%E5%8A%A1&aqs=chrome..69i57j69i61.4824j1j7&sourceid=chrome&ie=UTF-8″,由于不可避免的带有PATH、各种参数和追踪标识,这导致URL往往很长。当你要把这个URL发送给其它人时,可能会变得很不方便。比如短信/微博有字数限制。或者对方将链接粘贴到浏览器时,容易漏掉部分数据。
因此短链接服务就显得非常重要。(短链接还可以使的生成的二维码色块更大,提高识别速度)

国内常见的短地址服务有新浪 百度 那么他们是怎么实现的呢?

建议先阅读参考资料1

2. 实现&原理

2.1 实现

萌叔受到参考资料1的启发也实现了一版。
vearne/tinyurl
代码及使用步骤见README

你也可以 在线尝试

2.2 生成短地址

image_1dqogdl4i1e3vv2118our8jf8a9.png-9.7kB
1) 将长地址与一个整数建立映射(一对多)

这里整数使用int64,保存映射关系。笔者为了简单使用是MySQL数据库,如果为了更好的并发存储,还可以NoSQL数据库或者数据分分库分表。

"https://github.com/vearne/tinyurl" -> 10363

这里主键id就是整数值
长地址存储在url字段中

+-------+---------------------------------+---------------------+
| id    | url                             | created_at          |
+-------+---------------------------------+---------------------+
| 10000 | http://vearne.cc/archives/39217 | 2019-11-28 14:02:56 |
+-------+---------------------------------+---------------------+

提示 这里不能用哈希的原因是,哈希后的值如果太短则容易出现碰撞,如果太长则压缩的效率太低,没有意义。

2)base62编码

整数如果直接按字符串传输,长度还是太长。可以对整数进行base62编码
之所以是62,其实是 26个小写英文字母[a-z], 26个大写英文字母[A-Z], 以及阿拉伯数字[0-9]。有意的避开特殊符号和不可见字符。

3) 拼接上域名

就得形如, 短链接地址: http://st.vearne.cc/2h9

2.3 访问短地址

seq.png-95.2kB

访问短地址得到长地址的过程与短地址的生成过程刚好相反

1)base62解码

base62解码得到整数

2)通过整数查找到长地址值
3)通过302响应将长地址返回给客户端

301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化。 选择301也是可以的。但是如果使用了 301,我们就无法统计到短地址被点击的次数了。而这个点击次数是一个非常有意思的大数据分析数据源。能够分析出的东西非常非常多。所以选择302虽然会增加服务器压力,但是我想是一个更好的选择。
见笔者文章 聊聊HTTPCODE 301和302 重定向

4)客户端再长地址所指向的目标发送请求

考虑到某些短链接可能被高频访问,为了降低MySQL的压力,还需要增加cache,提高 整数值–> 长地址值的查找速度

  1. 国内有哪些靠谱的短链接服务

请我喝瓶饮料

微信支付码

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK