聊聊短地址服务的实现

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

1. 前言

一个长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 生成短地址

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 访问短地址

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

1)base62解码

base62解码得到整数

2)通过整数查找到长地址值

3)通过302响应将长地址返回给客户端

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

见笔者文章 聊聊HTTPCODE 301和302 重定向

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

3. 优化

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

参考资料

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

请我喝瓶饮料