聊聊短地址服务的实现
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://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 | https://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,提高 整数值--> 长地址值的查找速度